Django 模型的关系以及从数据库中获取(或排除)相关数据[重复]

问题描述 投票:0回答:1

我很难在 django 的官方文档中找到对此的合理解释,所以我会在这里问我的问题。

在 django 5.0 中,如果两个模型与 OneToOneField、ForeignKey 还是 ManyToManyField 之间存在关系(让我们称它们为

Model1
Model2
),当您使用如下查询从数据库中获取某些对象时:

data = Model1.objects.filter(field1=value)

是否会自动获取与

Model2
中的对象相关的
data
对象(属于
Model1
类型)并加入到查询集中?

如果我的问题的答案是“是”,我想知道如何从查询集中排除一些相关数据,如果答案是“否”,我想知道如何将它们包含在查询集中。

请注意,关系可以是任何类型(一对一、多对一、多对多),并且可以是反向或正向关系。如果我的问题的答案取决于两个对象之间的关系类型,请解释所有可能的情况。

如果您知道我到底可以在哪里阅读此内容,请给我留下链接。

我尝试向一群人工智能询问这个问题,但他们只是用矛盾的答案让我困惑。

django database django-queryset relationship
1个回答
0
投票

是否会自动获取与数据中的对象(类型为

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

我尝试向一群人工智能询问这个问题,但他们只是用矛盾的答案让我困惑。

聊天机器人本质上是一个单词预测器:它确定给定上下文中最有可能的下一个单词是什么。因此,提出相同的问题会产生不同的答案,而问题的细微变化也会引发完全不同的答案。

© www.soinside.com 2019 - 2024. All rights reserved.