Отрицание запроса Django

Я знаю, как создавать фильтры и объекты Q в django, но я не знаю, как отменить операторы, которые предоставляет API, например, для оператора contains я хотел бы что-то вроде notcontains.

e.g.

q=Q(name__notcontains="SomeString")

Это даст мне все объекты, имя которых не содержит «SomeString».

Есть ли какой-то синтаксис, который мне не хватает?

Спасибо.


person Daniel Gollás    schedule 03.02.2010    source источник


Ответы (3)


Вы можете использовать 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 содержит «Слон», но НЕ содержит «SomeString»)

person Ludwik Trammer    schedule 03.02.2010

Вот справочник по API QuerySet. exclude, кажется, делает то, что вы хотите.

person Hank Gay    schedule 03.02.2010
comment
Большой! это именно то, что мне нужно, хотя его нельзя использовать внутри объекта Q, можно просто связать фильтры вместе: q=Q(title__contains=SomeTerm) TheModel.objects.filter(q).exclude(title__contains=SomeTermWeDontWant) Спасибо! - person Daniel Gollás; 03.02.2010

Либо используйте exclude, как предлагает Хэнк, либо, для конкретного случая contains, используйте Q(name__regex=r'!(SomeString)'), если вам действительно нужно использовать filter. Имейте в виду, что regex не зависит от базы данных, сначала проверьте, какой синтаксис поддерживает ваша база данных.

person kibitzer    schedule 03.02.2010