Django文档错误?

Django文档错误?,django,Django,在Django官方文档中关于从QuerySet()中排除的部分中,有几个查询的解释: 此示例排除发布日期晚于2005-1-3且标题为“Hello”的所有条目: Entry.objects.exclude(pub_date__gt=datetime.date(2005, 1, 3), headline='Hello') Entry.objects.exclude(pub_date__gt=datetime.date(2005, 1, 3)).exclude(headline='Hello')

在Django官方文档中关于从QuerySet()中排除的部分中,有几个查询的解释:

此示例排除发布日期晚于2005-1-3且标题为“Hello”的所有条目:

Entry.objects.exclude(pub_date__gt=datetime.date(2005, 1, 3), headline='Hello')
Entry.objects.exclude(pub_date__gt=datetime.date(2005, 1, 3)).exclude(headline='Hello')
在SQL术语中,其计算结果为:

SELECT ...
WHERE NOT (pub_date > '2005-1-3' AND headline = 'Hello')
SELECT ...
WHERE NOT pub_date > '2005-1-3'
AND NOT headline = 'Hello'
此示例排除发布日期晚于2005-1-3或标题为“Hello”的所有条目:

Entry.objects.exclude(pub_date__gt=datetime.date(2005, 1, 3), headline='Hello')
Entry.objects.exclude(pub_date__gt=datetime.date(2005, 1, 3)).exclude(headline='Hello')
在SQL术语中,其计算结果为:

SELECT ...
WHERE NOT (pub_date > '2005-1-3' AND headline = 'Hello')
SELECT ...
WHERE NOT pub_date > '2005-1-3'
AND NOT headline = 'Hello'
请注意,第二个示例更具限制性


最后一个我不清楚。我看不出第一个和第二个之间有什么区别,有人能解释一下吗?

第一个示例创建了一个嵌套的子表达式,而第二个示例创建了两个单独的表达式。

如果您指的是“注意,第二个示例更具限制性”部分,也许一个更数学的方法可以帮助您:

NOT(发布日期>'2005-1-3'和标题='Hello')

可翻译为:

不发布日期>'2005-1-3'或不发布标题='Hello'

与之相比:

不是发布日期>'2005-1-3'而不是标题='Hello'

由于您希望
的任一部分为真,因此限制性较小,即-
A或B
的限制性小于
A和B

回到文档,在第一种情况下,您排除了同时符合这两个限制的人。在第二种情况下,你排除了那些符合第一种限制的人,从中你排除了那些符合第二种限制的人,也就是说,你排除了那些符合其中任何一种限制的人

@OP评论:假设我们有四个项目AA、AB、BB和CC。如果我们说:

Item.objects.filter(name_startswith='A', name_endswith='B')
结果将是{AB}。当然,如果我们说:

Item.objects.exclude(name_startswith='A', name_endswith='B')
结果将是{AA,BB,CC},因为我们只想排除那些以“A”开头并以“B”结尾的人。下一个:

Item.objects.exclude(name_startswith='A')
将导致{BB,CC}。但是,当我们另一个排除:

Item.objects.exclude(name_startswith='A').exclude(name_endswith='B')
我们实际上是说
第一个排除的结果。排除(name\u endswith='B')
。即:

{BB, CC}.exclude(name_endswith='B')
它将返回{CC}。不同于
过滤器
,其中

Item.objects.filter(<condition_1>).filter(<condition_2>)
Item.objects.filter().filter()
其结果与:

Item.objects.filter(<condition_1>, <condition_2>)
Item.objects.filter(,)
排除是链接的。它类似于布尔运算:

非(A和B)=非A或非B
NOT(A或B)=NOT A和NOT B

Thx对于答案,接下来是另一个问题:Entry.objects.exclude(pub_date\uu gt=datetime.date(2005,1,3))。exclude(headline='Hello')等于SELECT。。。如果不是发布日期>'2005-1-3'而不是标题='Hello',我真的不明白为什么sql中有AND,而不是OR?