Отрицание запроса Django - PullRequest
27 голосов
/ 03 февраля 2010

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

например.

q=Q(name__notcontains="SomeString")

Это даст мне все объекты, чье имя не содержит "SomeString".

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

Thankyou.

Ответы [ 3 ]

60 голосов
/ 03 февраля 2010

Вы можете использовать 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 ")

3 голосов
/ 03 февраля 2010

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

2 голосов
/ 03 февраля 2010

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

...