协慌网

登录 贡献 社区

如何在 Django queryset 过滤中执行不等于?

在 Django 模型 QuerySet 中,我看到__gt__lt ,但是有__ne!=不等于)吗?我想使用不等于过滤掉。例如,对于

Model:
    bool a;
    int x;

我想要做

results = Model.objects.exclude(a=True, x!=5)

!=是不正确的语法。我也尝试过__ne

我最终使用:

results = Model.objects.exclude(a=True, x__lt=5).exclude(a=True, x__gt=5)

答案

您可以为此使用 Q 对象。 ~运算符将它们取反,并像普通的 Python 表达式一样组合它们:

from myapp.models import Entry
from django.db.models import Q

Entry.objects.filter(~Q(id=3))

将返回除 ID 3条目以外的所有条目:

[<Entry: Entry object>, <Entry: Entry object>, <Entry: Entry object>, ...]

您的查询似乎有一个双重否定,您想排除x不为 5 的所有行,换句话说,您要包括x5 的所有行。我相信这可以解决问题:

results = Model.objects.filter(x=5).exclude(a=True)

为了回答您的特定问题,没有 “不等于” 字段查找,但这可能是因为 Django 同时提供了filterexclude方法,因此您始终可以切换逻辑以获得所需的结果。

查询中的field=value field__exact=value的简写。也就是说, Django 将查询运算符放在标识符中的查询字段上。 Django 支持以下运算符:

exact
iexact
contains
icontains
in
gt
gte
lt
lte
startswith
istartswith
endswith
iendswith
range

date
year
iso_year
month
day
week
week_day
iso_week_day
quarter
time
hour
minute
second

isnull
regex
iregex

我敢肯定,如 Dave Vogt 所建议的那样,将它们与 Q 对象结合起来,并像Jason Baker 所建议的filter()exclude() ,就可以对任何可能的查询获得准确的需求。