我很难在 django 的官方文档中找到对此的合理解释,所以我会在这里问我的问题。
在 django 5.0 中,如果两个模型与 OneToOneField、ForeignKey 还是 ManyToManyField 之间存在关系(让我们称它们为
Model1
和 Model2
),当您使用如下查询从数据库中获取某些对象时:
data = Model1.objects.filter(field1=value)
是否会自动获取与
Model2
中的对象相关的 data
对象(属于 Model1
类型)并加入到查询集中?
如果我的问题的答案是“是”,我想知道如何从查询集中排除一些相关数据,如果答案是“否”,我想知道如何将它们包含在查询集中。
请注意,关系可以是任何类型(一对一、多对一、多对多),并且可以是反向或正向关系。如果我的问题的答案取决于两个对象之间的关系类型,请解释所有可能的情况。
如果您知道我到底可以在哪里阅读此内容,请给我留下链接。
我尝试向一群人工智能询问这个问题,但他们只是用矛盾的答案让我困惑。
是否会自动获取与数据中的对象(类型为
)相关的Model2
对象并加入到查询集中?Model1
.select_related(…)
[Django-doc]:
Model1.objects.filter(field1=value).select_related('my_field_name')
其中
my_field_name
是 ForeignKey
或 OneToOneField
的名称,或者是 related_name
的 OneToOneField
[Django-doc]。
如果您想使用
ManyToManyField
或反向 ForeignKey
,那么使用 JOIN 将是糟糕的查询设计:这意味着对于 Model1
,将重复相同的列值,以获得尽可能多的相关 Model2
。是。在这种情况下,使用 .prefetch_related(…)
[Django-doc],这将进行额外的查询来获取第一个查询集中的 all 项目的 all 相关项目,从而最大限度地减少查询之间的带宽数据库和 Django 应用程序:
Model1.objects.filter(field1=value).select_related('my_m2m_field_name')
您还可以将其用于(反向)
OneToOneField
和ForeignKey
。
我尝试向一群人工智能询问这个问题,但他们只是用矛盾的答案让我困惑。
聊天机器人本质上是一个单词预测器:它确定给定上下文中最有可能的下一个单词是什么。因此,提出相同的问题会产生不同的答案,而问题的细微变化也会引发完全不同的答案。