在Django queryset过滤中如何做不相等?

2024-03-29 11:27:29 发布

您现在位置:Python中文网/ 问答频道 /正文

在Django模型查询集中,我看到比较值有一个__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)

Tags: django模型ltgttrue示例modelobjects
3条回答

或许Q objects可以帮助解决这个问题。我从未使用过它们,但它们似乎可以被否定和组合,就像普通的python表达式一样。

最新消息:我刚刚试过,看起来效果不错:

>>> from myapp.models import Entry
>>> from django.db.models import Q

>>> Entry.objects.filter(~Q(id = 3))

[<Entry: Entry object>, <Entry: Entry object>, <Entry: Entry object>, ...]

您的查询似乎有一个双负数,您希望排除x不是5的所有行,因此换句话说,您希望包括x是5的所有行。我相信这会成功的。

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

要回答您的特定问题,没有“不等于”,但这可能是因为django同时有“filter”和“exclude”方法可用,因此您可以随时切换逻辑以获得所需的结果。

查询中的field=value语法是field__exact=value的简写。也就是说Django puts query operators on query fields in the identifiers。Django支持以下运算符:

exact
iexact
contains
icontains
in
gt
gte
lt
lte
startswith
istartswith
endswith
iendswith
range
year
month
day
week_day
isnull
search
regex
iregex

我确信,通过将它们与Q对象组合成Dave Vogt suggests,并使用filter()exclude()作为Jason Baker suggests,您将得到您所需要的任何可能的查询。

相关问题 更多 >