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

当前回答

查询中的field=value语法是field__exact=value的缩写。也就是说,Django将查询操作符放在标识符中的查询字段上。Django支持以下操作符:

exact
iexact
contains
icontains
in
gt
gte
lt
lte
startswith
istartswith
endswith
iendswith
range

date
year
iso_year
month
day
week
week_day
iso_week_day
quarter
time
hour
minute
second

isnull
regex
iregex

我相信,通过像Dave Vogt建议的那样将这些对象与Q对象结合起来,并像Jason Baker建议的那样使用filter()或exclude(),您将得到几乎任何可能的查询所需要的东西。

其他回答

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

from model_values import F
Model.objects.exclude(F.x != 5, 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
)

这应该可以

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

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

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

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

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

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