在Django模型QuerySets中,我看到有一个__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)

当前回答

查询中的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(),您将得到几乎任何可能的查询所需要的东西。

其他回答

你应该像这样使用过滤和排除

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

这会给你想要的结果。

from django.db.models import Q
results = Model.objects.exclude(Q(a=True) & ~Q(x=5))

对于not equal,可以在equal查询上使用~。显然,Q可以用来达到相等的查询。

注意这个问题有很多错误的答案!

Gerard的逻辑是正确的,尽管它将返回一个列表而不是一个查询集(这可能无关紧要)。

如果你需要一个queryset,使用Q:

from django.db.models import Q
results = Model.objects.filter(Q(a=false) | Q(x=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>, ...]

查询中的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(),您将得到几乎任何可能的查询所需要的东西。