gpt4 book ai didi

django - 跨越多值关系

转载 作者:行者123 更新时间:2023-12-04 17:12:02 24 4
gpt4 key购买 nike

我阅读了 django 文档,发现了一些令人困惑的地方! https://docs.djangoproject.com/en/3.2/topics/db/queries/#spanning-multi-valued-relationships .

据说“当您基于 ManyToManyField 或反向 ForeignKey 过滤对象时,您可能会对两种不同类型的过滤器感兴趣

“要选择包含标题中同时包含“Lennon”条目且发表于 2008 年的所有博客(满足两个条件的同一条目),我们会这样写:”

Blog.objects.filter(entry__headline__contains='Lennon', entry__pub_date__year=2008)

“要选择标题中包含带有“Lennon”的条目以及 2008 年发布的条目的所有博客,我们会写:”

Blog.objects.filter(entry__headline__contains='Lennon').filter(entry__pub_date__year=2008)

“假设只有一个博客的条目包含“Lennon”和 2008 年的条目,但 2008 年的条目都不包含“Lennon”。第一个查询不会返回任何博客,但第二个查询将返回那个博客"

因此,通过阅读本指南,我脑海中产生了多个问题:

1- 这两种类型的过滤有什么区别?我所知道的是,他们都必须返回标题中同时包含“Lennon”且发表于 2008 年的博客。我找不到重点。

2- 文档说此规则仅适用于 ManyToManyField 或反向外键。问题是,为什么?

最佳答案

What is the difference between these two types of filtering?

假设您有一个包含两个(或更多)条目的Blog。其中一个条目的标题是一些包含单词 'Lennon'不是写于 2008 年的文本,此外该博客还有一个条目没有 标题中的单词 'Lennon',但写于 2008 年。

使用 .filter(entry__headline__contains='Lennon', entry__pub_date__year=2008) 的第一个查询查找标题中包含 'Lennon' 的条目 并且 相同的条目应该写在 2008 年。对于我们在第一段中定义的示例数据,这意味着此 Blog 未被选中,因为这两个条件适用于相同条目。

另一方面,如果您将其写为 .filter(entry__headline__contains='Lennon').filter(entry__pub_date__year=2008),Django 将生成两个 LEFT OUTER JOIN,这意味着它会查找一个博客,其中一个条目的标题包含 Lennon,以及一个条目(这可以是不同的 或同一条目)已于 2008 年编写。因此,这将检索第一段中定义的 Blog

The Document says this rule is just for ManyToManyField or a reverse ForeignKey. The question is, Why?

因为反向 ForeignKey 是一对多关系,而 ManyToManyField 跨越多对多关系。 …-to-many 在这里很重要。如果那是一个…-to-one,那么制作一个包含两个或更多条目的Blog是根本不可能的:如果一个Blog有一个 ForeignKey 到一个 Entry 模型,那么这意味着博客只能有 一个 条目,不能有多个。由于这因此将条目数限制为一个,因此不可能有两个或更多条目,因此过滤不会区分这两种情况。

关于django - 跨越多值关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69246373/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com