在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.exclude(a=true).filter(x=5)

其他回答

有三种选择:

Chain exclude and filter results = Model.objects.exclude(a=True).filter(x=5) Use Q() objects and the ~ operator from django.db.models import Q object_list = QuerySet.filter(~Q(a=True), x=5) Register a custom lookup function from django.db.models import Lookup from django.db.models import Field @Field.register_lookup class NotEqual(Lookup): lookup_name = 'ne' def as_sql(self, compiler, connection): lhs, lhs_params = self.process_lhs(compiler, connection) rhs, rhs_params = self.process_rhs(compiler, connection) params = lhs_params + rhs_params return '%s <> %s' % (lhs, rhs), params Which can the be used as usual: results = Model.objects.exclude(a=True, x__ne=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>, ...]

这会给你想要的结果。

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

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

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

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

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

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