在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)

当前回答

这应该可以

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

其他回答

您要寻找的是所有具有a=false或x=5的对象。在Django中,|作为查询集之间的OR运算符:

results = Model.objects.filter(a=false)|Model.objects.filter(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>, ...]

最后一段代码将排除x!=5, a为True。试试这个:

results = Model.objects.filter(a=False, x=5)

记住,上面一行中的=号将参数a赋值为False,将数字5赋值给参数x。这不是在检查是否相等。因此,实际上没有任何方法可以在查询调用中使用!=符号。

Django-model-values (disclosure: author)提供了一个NotEqual查找的实现,如下面的答案所示。它还提供了语法支持:

from model_values import F
Model.objects.exclude(F.x != 5, a=True)

虽然你可以用=,__gt, __gte, __lt, __lte来过滤模型,但你不能使用ne或!=。但是,您可以使用Q对象实现更好的过滤。

你可以避免链接QuerySet.filter()和QuerySet.exclude(),并使用以下方法:

from django.db.models import Q
object_list = QuerySet.filter(~Q(field='not wanted'), field='wanted')