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

当前回答

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

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

其他回答

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

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

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

您的查询似乎有一个双重否定,您希望排除x不等于5的所有行,所以换句话说,您希望包括x等于5的所有行。我相信这能达到目的:

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

为了回答你的具体问题,这里没有“not equal To”字段查找,但这可能是因为Django同时提供了过滤和排除方法,所以你可以随时切换逻辑来得到想要的结果。

使用排除和过滤

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

results = Model.objects。filter(a = True)。生成sql: select * from tablex where a != 0 and x !=5 sql取决于True/False字段的表示方式,以及数据库引擎。django代码是你所需要的。

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

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

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

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