Django queryset EXCLUDE:这些等效吗?

时间:2018-09-07 11:37:07

标签: django logic django-queryset

在Django中,这两个是等效的吗?

Cars.objects.exclude(brand='mercedes').exclude(year__lte=2000)

Cars.objects.exclude(brand='mercedes', year__lte=2000)

我知道第一个说的是:排除任何奔驰汽车,也排除任何2000年以前的旧车。 那第二个呢?它说的一样吗?还是只排除了2000年以上的奔驰组合?

谢谢!

1 个答案:

答案 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,不排除 (因此它将成为查询集的一部分)。