Django查询集EXCLUDE:这些是等价的吗?

job*_*ima 3 django logic django-queryset

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

Cars.objects.exclude(brand='mercedes').exclude(year__lte=2000)
Run Code Online (Sandbox Code Playgroud)

Cars.objects.exclude(brand='mercedes', year__lte=2000)
Run Code Online (Sandbox Code Playgroud)

我知道第一个说:排除任何梅赛德斯并排除任何比2000年更早的车.第二个怎么样?它说的一样吗?或者它只排除梅赛德斯比2000年更早的组合?

谢谢!

Wil*_*sem 8

这两者并不相同.

如以下文档exclude(..)中所述:

查询参数(**kwargs)应采用下面的字段查找中描述的格式.多个参数通过基础SQL语句中的AND连接,整个事件包含在一个NOT().

所以第一个查询可以读作:

-- first query
SELECT car.*
FROM car
WHERE NOT (brand = 'mercedes') AND NOT (YEAR <= 2000)
Run Code Online (Sandbox Code Playgroud)

而后者相当于:

-- second query
SELECT car.*
FROM car
WHERE NOT (brand = 'mercedes' AND YEAR <= 2000)
Run Code Online (Sandbox Code Playgroud)

第一个查询在语义上与" 所有不是梅赛德斯的车辆相同;并且在2000年之前或之后不构建 ".而第二个问题是" 除了Mercedeses之外的所有汽车,这些汽车是在2000年之前或之后建造的 ".

因此,在情况下该表中包含内置于1993福特,则第一查询将包括它,而第二意愿,由于brand奔驰,它排除(因此这将是查询集的一部分).