当前位置:  开发笔记 > 编程语言 > 正文

如何在Django查询集过滤中做不相等的操作?

如何解决《如何在Django查询集过滤中做不相等的操作?》经验,为你挑选了13个好方法。

在Django模型QuerySets中,我看到有一个__gt__ltfor的比较值,但是有__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)

Dave Vogt.. 637

也许Q对象可以帮助解决这个问题.我从来没有使用它们,但似乎它们可以被否定和组合,就像普通的python表达式一样.

更新:我刚试了一下,看起来效果很好:

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

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

[, , , ...]

@JCLeitão:另请参阅[@ d4nt的答案](http://stackoverflow.com/a/4139956/20578)以获得更直观的语法. (14认同)


d4nt.. 564

您的查询似乎有一个双重否定,您想要排除x不是5的所有行,所以换句话说,您想要包含x IS 5的所有行.我相信这样做会有所帮助.

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

要回答你的具体问题,没有"不等于",但这可能是因为django同时具有"过滤"和"排除"方法,因此你可以随时切换逻辑轮以获得所需的结果.



1> Dave Vogt..:

也许Q对象可以帮助解决这个问题.我从来没有使用它们,但似乎它们可以被否定和组合,就像普通的python表达式一样.

更新:我刚试了一下,看起来效果很好:

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

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

[, , , ...]


@JCLeitão:另请参阅[@ d4nt的答案](http://stackoverflow.com/a/4139956/20578)以获得更直观的语法.

2> d4nt..:

您的查询似乎有一个双重否定,您想要排除x不是5的所有行,所以换句话说,您想要包含x IS 5的所有行.我相信这样做会有所帮助.

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

要回答你的具体问题,没有"不等于",但这可能是因为django同时具有"过滤"和"排除"方法,因此你可以随时切换逻辑轮以获得所需的结果.


@danigosa这似乎不对.我自己试过这个,而`exclude`和`filter`调用的顺序没有任何有意义的区别.`WHERE`子句中条件的顺序发生了变化,但这又如何重要?
@danigosa排除和过滤顺序无关紧要.
我认为这是错误的,因为错误地排除了一个实例(x = 4,a = false).

3> SingleNegati..:

field=value查询中的语法是一种简写field__exact=value.也就是说,Django将查询运算符放在标识符中的查询字段中.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建议和使用的那样,filter()或者exclude()正如Jason Baker建议你将得到你所需要的几乎任何可能的查询.


“包含”,“ iexact”等中的“ i”表示“忽略大小写”。它不是用于“逆”。

4> Dmitrii Mikh..:

使用Django 1.7创建自定义查找很容易.Django官方文档中有一个__ne查找示例.

您需要首先创建查找本身:

from django.db.models import Lookup

class NotEqual(Lookup):
    lookup_name = 'ne'

    def as_sql(self, qn, connection):
        lhs, lhs_params = self.process_lhs(qn, connection)
        rhs, rhs_params = self.process_rhs(qn, connection)
        params = lhs_params + rhs_params
        return '%s <> %s' % (lhs, rhs), params

然后你需要注册它:

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

现在您可以在__ne查询中使用查找,如下所示:

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



5> ilse2005..:

Django 1.9/1.10中有三个选项.

    连锁excludefilter

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

    使用Q()对象和~运算符

    from django.db.models import Q
    object_list = QuerySet.filter(~Q(a=True), x=5)
    

    注册自定义查找功能

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

    register_lookup在加装饰的Django 1.8和可定制的查找和往常一样:

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



6> Dami..:

虽然与模型,您可以用过滤=,__gt,__gte,__lt,__lte,你不能使用ne,!=或者<>.但是,您可以使用Q对象实现更好的过滤.

您可以避免链接QuerySet.filter()QuerySet.exlude(),并使用此:

from django.db.models import Q
object_list = QuerySet.filter(~Q(field='not wanted'), field='wanted')



7> Lutz Prechel..:
待定设计决定.同时,使用exclude()

Django问题跟踪器有一个非凡的条目#5763,标题为"Queryset没有"不等于"过滤器运算符".值得注意的是(截至2016年4月)它是​​"9年前开放"(在Django石器时代),"4年前关闭","5个月前最后一次改变".

仔细阅读讨论,很有意思.基本上,一些人认为__ne应该有的则说加入exclude()更清晰,因此__ne 应该添加.

(我同意前者,因为后者的论点大致相当于说Python不应该!=因为它已经==并且not已经......)



8> outoftime..:

你应该使用filterexclude喜欢这个

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



9> jincy mariam..:

使用排除和过滤

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



10> Jason Baker..:

最后一段代码将排除x!= 5和a为True的所有对象.试试这个:

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

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


这不是100%相同的事情,因为这些字段也可能有Null值.

11> A. Coady..:

Django-model-values(公开:作者)提供了NotEqual查找的实现,如此答案所示。它还为此提供了语法支持:

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



12> Gerard..:

你所寻找的是具有或者所有对象a=false x=5.在Django中,|作为查询集OR之间的运算符:

results = Model.objects.filter(a=false)|Model.objects.filter(x=5)



13> 小智..:

结果= Model.objects.filter(a = True).exclude(x = 5)
生成此sql:
从tablex中选择*,其中a = 0且x!= 5
sql取决于您的True / False字段的表示方式以及数据库引擎。Django代码是您所需要的。

推荐阅读
135369一生真爱_890
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有