我知道如何在django中构建过滤器和Q对象,但我不知道如何否定API提供的运算符,例如对于包含运算符我想要的东西就像notcontains。
e.g。
q=Q(name__notcontains="SomeString")
这会得到所有名称不包含“SomeString”的对象。
是否有一些我缺少的语法?
三江源。
答案 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 reference。 exclude
似乎做你想做的事。
答案 2 :(得分:2)
使用exclude
作为Hank建议,或者对于特定的contains
情况,使用Q(name__regex = r'!(SomeString)')如果你真的需要使用{{1} }。虽然filter
与数据库无关,但要注意,请先检查数据库支持的语法。