【发布时间】:2010-02-03 19:43:26
【问题描述】:
我知道如何在 django 中构建过滤器和 Q 对象,但我不知道如何否定 API 提供的运算符,例如对于 contains 运算符,我想要类似 notcontains 的东西。
例如
q=Q(name__notcontains="SomeString")
这会得到所有名称不包含“SomeString”的对象。
我缺少一些语法吗?
谢谢。
【问题讨论】:
我知道如何在 django 中构建过滤器和 Q 对象,但我不知道如何否定 API 提供的运算符,例如对于 contains 运算符,我想要类似 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 reference。 exclude 似乎在做你想做的事。
【讨论】:
按照 Hank 的建议使用 exclude,或者对于特定的 contains 情况,如果您确实需要使用 filter,请使用 Q(name__regex=r'!(SomeString)')。尽管regex 与数据库无关,但请注意,请先检查您的数据库支持的语法。
【讨论】: