Django查询否定

时间:2010-02-03 19:43:27

标签: django negation

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

e.g。

q=Q(name__notcontains="SomeString")

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

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

三江源。

3 个答案:

答案 0 :(得分:60)

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

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

(“除了names包含”SomeString“的那些条目外,给我所有条目。)

当处理Q对象时,可以在Q对象之前使用“〜”符号来表示否定。例如,以下语句表示“给我所有条目names包含”大象“,但不包含”SomeString“:

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

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

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

(“给我所有条目,除了包含”大象“的names,但不包含”SomeString“)

答案 1 :(得分:3)

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

答案 2 :(得分:2)

使用exclude作为Hank建议,或者对于特定的contains情况,使用Q(name__regex = r'!(SomeString)')如果你真的需要使用{{1} }。虽然filter与数据库无关,但要注意,请先检查数据库支持的语法。