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年更早的组合?
谢谢!
这两者并不相同.
如以下文档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是不奔驰,它不排除(因此这将是查询集的一部分).