【问题标题】:Django query negationDjango查询否定
【发布时间】:2010-02-03 19:43:26
【问题描述】:

我知道如何在 django 中构建过滤器和 Q 对象,但我不知道如何否定 API 提供的运算符,例如对于 contains 运算符,我想要类似 notcontains 的东西。

例如

q=Q(name__notcontains="SomeString")

这会得到所有名称不包含“SomeString”的对象。

我缺少一些语法吗?

谢谢。

【问题讨论】:

    标签: django negation


    【解决方案1】:

    您可以使用exclude() 代替filter()

    Entry.objects.exclude(name__contains="SomeString")
    

    ("给我除了names 包含“SomeString”的所有条目)

    并且在处理 Q 对象时,可以在 Q 对象之前使用“~”符号来表示否定。例如,以下语句的意思是“给我所有 names 包含“Elephant”但不包含“SomeString”的条目:

    Entry.objects.filter(Q(name__contains="Elephant") & ~Q(name__contains="SomeString"))
    

    在某些情况下,您可能希望同时使用这两种方法:

    Entry.objects.exclude(Q(name__contains="Elephant") & ~Q(name__contains="SomeString"))
    

    ("给我所有的条目,除了那些names 包含“Elephant”但不包含“SomeString”的条目)

    【讨论】:

      【解决方案2】:

      这是QuerySet API referenceexclude 似乎在做你想做的事。

      【讨论】:

      • 太棒了!这正是我所需要的,虽然它不能在 Q 对象中使用,但可以简单地将过滤器链接在一起: q=Q(title__contains="SomeTerm") TheModel.objects.filter(q).exclude(title__contains= “SomeTermWeDontWant”)谢谢!
      【解决方案3】:

      按照 Hank 的建议使用 exclude,或者对于特定的 contains 情况,如果您确实需要使用 filter,请使用 Q(name__regex=r'!(SomeString)')。尽管regex 与数据库无关,但请注意,请先检查您的数据库支持的语法。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-07-18
        • 2020-04-16
        • 2017-12-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多