在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的官方文档中有一个__ne查找的例子。

你需要先创建查找本身:

from django.db.models import 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

然后你需要注册它:

from django.db.models import Field
Field.register_lookup(NotEqual)

现在你可以像这样在你的查询中使用__ne查找:

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>, ...]

创建一个自定义查找很容易,在Django的官方文档中有一个__ne查找的例子。

你需要先创建查找本身:

from django.db.models import 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

然后你需要注册它:

from django.db.models import Field
Field.register_lookup(NotEqual)

现在你可以像这样在你的查询中使用__ne查找:

results = Model.objects.exclude(a=True, x__ne=5)

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

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

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

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

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

有条件的过滤器:

当条件表达式返回布尔值时,可以直接在过滤器中使用它。这里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
)