【问题标题】:Django ORM : model with a list of items from another modelDjango ORM:具有来自另一个模型的项目列表的模型
【发布时间】:2020-09-06 16:45:48
【问题描述】:

在我的 Django 模型中,我有两个模型:一个称为 Site,另一个称为 SiteFeature

Object-wise,它应该如何工作非常清楚:Site 类的每个实例都应该有一个包含 SiteFeature 实例的列表作为属性 类,仅仅是因为 SiteFeature 对象应该只与 Site 对象相关。

Database-wise,它应该如何工作也很清楚:SiteFeature 表应该包含一个不可为空的列,引用 Site 表,带有外键。

但就 Django ORM 而言,我不知道如何编写代码。

基于this questionthis other example,似乎经典的进行方式相反:

  • Site 模型类不包含引用 SiteFeature 列表的 ORM 模型字段。
  • 相反,SiteFeature ORM 模型类有一个 ForeignKey 字段引用 Site 类。

我看到有一种方法可以将其编码出来:通过向 Site 模型类添加一个搜索所有相关 SiteFeature 的函数,并使该函数成为一个属性(装饰者@property):

@property
def site_features(self):
    return SiteFeature.objects.filter(site_id=site_id)

但这让我怀疑:

对我来说正确的逻辑也是,当我保存、更新或创建 Site 类的实例时,它也会自动保存/更新/创建 SiteFeature 与它相关。 (删除对象也是如此,但可以通过 ForeignKey 字段的on_delete=models.CASCADE 参数覆盖)。 我可以添加我自己的 save_with_features / update_with_features / create_with_features 方法来级联所有方法,但我不确定如果由Django 以标准的保存/更新/创建等批量操作。

这个问题似乎很基本,我想已经有合适的方法来解决了。 那会怎样?

【问题讨论】:

    标签: python django orm django-orm


    【解决方案1】:

    最终,我用sitefeature_set Manager 解决了这个问题。

    参考:https://docs.djangoproject.com/en/3.0/topics/db/queries/#following-relationships-backward

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-08-27
      • 2021-03-27
      • 2019-09-04
      • 1970-01-01
      • 2011-08-30
      • 2010-10-09
      • 1970-01-01
      相关资源
      最近更新 更多