38

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

例如

q=Q(name__notcontains="SomeString")

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

是否有一些我缺少的语法?

谢谢你。

4

3 回答 3

87

您可以使用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”的条目)

于 2010-02-03T19:59:37.407 回答
5

这是QuerySet API 参考exclude似乎做你想做的事。

于 2010-02-03T19:47:53.930 回答
2

要么exclude按照汉克的建议使用,要么在特定contains情况下使用 Q(name__regex=r'!(SomeString)') 如果你真的需要使用filter. 请注意,尽管这regex与数据库无关,但请首先检查您的数据库支持的语法。

于 2010-02-03T20:13:05.187 回答