Django文档错误?
在Django官方文档中关于从QuerySet()中排除的部分中,有几个查询的解释: 此示例排除发布日期晚于2005-1-3且标题为“Hello”的所有条目: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')
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 BThx对于答案,接下来是另一个问题:Entry.objects.exclude(pub_date\uu gt=datetime.date(2005,1,3))。exclude(headline='Hello')等于SELECT。。。如果不是发布日期>'2005-1-3'而不是标题='Hello',我真的不明白为什么sql中有AND,而不是OR?