我知道如何在 django 中构建过滤器和 Q 对象,但我不知道如何否定 API 提供的运算符,例如对于包含运算符,我想要类似 notcontains 的东西。
例如
q=Q(name__notcontains="SomeString")
这将使我得到所有名称不包含“SomeString”的对象。
是否有一些我缺少的语法?
谢谢你。
您可以使用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”的条目)
这是QuerySet API 参考。exclude
似乎做你想做的事。
要么exclude
按照汉克的建议使用,要么在特定contains
情况下使用 Q(name__regex=r'!(SomeString)') 如果你真的需要使用filter
. 请注意,尽管这regex
与数据库无关,但请首先检查您的数据库支持的语法。