【问题标题】:Django Models - Filter third model, based on two connected models?Django Models - 根据两个连接的模型过滤第三个模型?
【发布时间】:2020-11-08 20:53:14
【问题描述】:

如何改进 StoreDefaultAudience?

John's Store - 受众:受众 A、受众 B、受众 C

妮可的商店 - 受众:受众 D、受众 E

对于 StoreDefaultAudience,John's Store 应该只能选择 Audience A、Audience B、Audience C 作为默认受众

对于 StoreDefaultAudience,Nicole 的商店应该只能选择 Audience D、Audience E 作为默认受众

class Store(models.Model):
    store_name = models.CharField(max_length=50)

class Audience(models.Model):
    audience_name = models.CharField(max_length=50)
    store = models.ForeignKey(Store, on_delete=models.CASCADE)

# only one StoreDefaultAudience should be allowed per Store
# the default audiences should only be that stores audiences
class StoreDefaultAudience(models.Model)
    default_audience = models.ForeignKey(Audience, on_delete=models.CASCADE, unique=True)
    store = models.ForeignKey(Store, on_delete=models.CASCADE, unique=True) 

【问题讨论】:

  • #您可以通过覆盖 init #Pass the user's store as argument 来限制每个用户在您的 forms.py 上获得的选择。它将用于过滤查询集类 StoreDefaultAudience(forms.ModelForm): def __init__(self, store, *args, **kwargs): super(StoreDefaultAudience, self).__init__(*args, **kwargs) self.fields ['default_audience'] = forms.ModelChoiceField(queryset = models.Audience.objects.filter(store = store))

标签: django django-models


【解决方案1】:

如果StoreDefaultAudiencedefault_audience 只是store 的默认受众,您实际上不需要在数据库中为其创建列,请考虑使用属性快捷方式:

您也可以使用limit_choices_to 限制ForeignKey 选项 - 但请记住,这实际上只影响ModelForms,例如管理页面上的那个。

更多:(https://docs.djangoproject.com/en/dev/ref/models/fields/#django.db.models.ForeignKey.limit_choices_to)

class Audience(models.Model):
    
    ...

    # add related name to store field:
    store = models.ForeignKey(Store, on_delete=models.CASCADE, related_named='audiences')


class StoreDefaultAudience(models.Model)
    store = models.ForeignKey(..., limit_choices_to=<the query set>)
    @property
    def default_audience(self): return self.store.audiences.all()

【讨论】:

  • 我认为这不能解决问题。例如,对于 John's Store,他的默认受众可以是 Audience A、Audience B 或 Audience C。John's Store 应该能够修改他们的默认受众。
  • 默认受众不是A B和C,默认受众是A或B或C,你必须选择一个。
猜你喜欢
  • 2013-08-21
  • 1970-01-01
  • 2023-03-10
  • 2021-12-24
  • 1970-01-01
  • 2018-11-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多