Django 查询集 EXCLUDE : are these equivalent?

标签 django logic django-queryset

在 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 a 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 年制造的福特,那么第一个查询将包含它,而第二个查询将包含它,因为 brand 是 < em>not Mercedes,not 被排除在外(因此它将成为查询集的一部分)。

关于Django 查询集 EXCLUDE : are these equivalent?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52221778/

相关文章:

python - Django:如何在django.db.models.query QuerySet中重载Q以用于我的Manager中的特殊用途

powershell - Foreach 循环中的多个变量 [PowerShell]

java - 我正在尝试计算角度的正弦而不使用 java 中的 Math.sin()

mysql - django values_list 意外行为

python - django.db.models.Q 对象的 "|"和 "&"操作的中性元素?

python - 对象没有属性 '__getitem__'

python - 如何在 Django admin 中的字段中添加可点击链接?

python - Django ORM 与 Postgres : rows unexpectedly deleted - Bug?

c++ - 在哪里可以了解适用于 C++ 的 z3 定理证明程序 API?

python - 如何使用 Django 查询集仅获取数据库中存在的最后一个月的记录?