【发布时间】:2020-09-06 16:45:48
【问题描述】:
在我的 Django 模型中,我有两个模型:一个称为 Site,另一个称为 SiteFeature。
Object-wise,它应该如何工作非常清楚:Site 类的每个实例都应该有一个包含 SiteFeature 实例的列表作为属性 类,仅仅是因为 SiteFeature 对象应该只与 Site 对象相关。
Database-wise,它应该如何工作也很清楚:SiteFeature 表应该包含一个不可为空的列,引用 Site 表,带有外键。
但就 Django ORM 而言,我不知道如何编写代码。
基于this question 和this 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