在 Django 中,这两个是等价的吗?
Cars.objects.exclude(brand='mercedes').exclude(year__lte=2000)
和
Cars.objects.exclude(brand='mercedes', year__lte=2000)
?
我知道第一个说:排除任何梅赛德斯并排除任何超过 2000 年的汽车。 第二个呢?说的一样吗?还是只排除 2000 年以上的 mercedes 组合?
谢谢!
最佳答案
两者不等价。
正如 documentation on exclude(..)
中指定的那样:
The lookup parameters (
**kwargs
) should be in the format described in Field lookups below. Multiple parameters are joined via AND in the underlying SQL statement, and the whole thing is enclosed in aNOT()
.
所以第一个查询可以读作:
-- first query
SELECT car.*
FROM car
WHERE NOT (brand = 'mercedes') AND NOT (YEAR <= 2000)
而后者等价于:
-- second query
SELECT car.*
FROM car
WHERE NOT (brand = 'mercedes' AND YEAR <= 2000)
第一个查询在语义上与“所有不是梅赛德斯的汽车;并且不是在 2000 年之前或 2000 年制造的汽车”的语义相同。而第二个查询是“2000 年前或 2000 年制造的除梅赛德斯之外的所有汽车。”。
因此,如果表包含 1993 年制造的福特,那么第一个查询将不包含它,而第二个查询将包含它,因为 brand
是 < em>not Mercedes,not 被排除在外(因此它将成为查询集的一部分)。
关于Django 查询集 EXCLUDE : are these equivalent?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52221778/