在Django中,这两个是等效的吗?
Cars.objects.exclude(brand='mercedes').exclude(year__lte=2000)
和
Cars.objects.exclude(brand='mercedes', year__lte=2000)
?
我知道第一个说的是:排除任何奔驰汽车,也排除任何2000年以前的旧车。 那第二个呢?它说的一样吗?还是只排除了2000年以上的奔驰组合?
谢谢!
答案 0 :(得分:8)
两者不相同。
如documentation on exclude(..)
中所指定:
查找参数(
**kwargs
)应采用以下字段查找中所述的格式。 在基础SQL语句中通过AND连接多个参数,并且整个内容都包含在NOT()
中。
因此,第一个查询可以读取为:
-- 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年制造的Ford,则第一个查询将不包含它,而第二个查询将包含brand
是 not Mercedes,不排除 (因此它将成为查询集的一部分)。