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

当前回答

等待设计决定。同时,使用exclude()

Django的问题跟踪器有一个非常了不起的条目#5763, 标题为“Queryset没有一个“不等于”过滤操作符”。 这是值得注意的,因为(截至2016年4月)确实如此 “9年前开放”(在Django的石器时代), “4年前就关门了”,还有 “最后一次更改是5个月前”。

通读讨论,很有趣。 基本上,有些人认为__ne应该被添加 而其他人说exclude()更清楚,因此__ne . 不应该添加。

(我同意前者,因为后者的论点是 大致相当于说Python不应该有!= because 它已经==而且还没有…)

其他回答

有三种选择:

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)

等待设计决定。同时,使用exclude()

Django的问题跟踪器有一个非常了不起的条目#5763, 标题为“Queryset没有一个“不等于”过滤操作符”。 这是值得注意的,因为(截至2016年4月)确实如此 “9年前开放”(在Django的石器时代), “4年前就关门了”,还有 “最后一次更改是5个月前”。

通读讨论,很有趣。 基本上,有些人认为__ne应该被添加 而其他人说exclude()更清楚,因此__ne . 不应该添加。

(我同意前者,因为后者的论点是 大致相当于说Python不应该有!= because 它已经==而且还没有…)

使用排除和过滤

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

这应该可以

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

如果我们需要基于我们可以使用的子查询集来排除/否定,

有条件的过滤器:

当条件表达式返回布尔值时,可以直接在过滤器中使用它。这里non_unique_account_type返回一个布尔值。但是,我们仍然可以在过滤器中使用它。

>>> non_unique_account_type = Client.objects.filter(
...     account_type=OuterRef('account_type'),
... ).exclude(pk=OuterRef('pk')).values('pk')
>>> Client.objects.filter(~Exists(non_unique_account_type))

在SQL术语中,它的计算结果为:

SELECT * FROM client c0
WHERE NOT EXISTS (
  SELECT c1.id
  FROM client c1
  WHERE c1.account_type = c0.account_type AND NOT c1.id = c0.id
)