Вопрос
Я знаю, как создавать фильтры и Q объекты в Django, но я не знаю, как отрицать операторы, которые API обеспечивает, например, для оператора содержимого, который я хотел бы что-то вроде не совсем не совсем.
например
q=Q(name__notcontains="SomeString")
Это позволит мне все объекты, чье имя не содержит «самых».
Есть ли синтаксис, который мне не хватает?
Спасибо.
Решение
Вы можете использовать exclude()
на месте filter()
:
Entry.objects.exclude(name__contains="SomeString")
(«Дайте мне все записи, кроме тех, которые с names
содержащий «самую»)
И при работе с объектом q вы можете использовать символ «~» перед объектом Q для представления отрицания. Например, следующее утверждение означает «дать мне все записи с names
содержащий «слон», но не содержащий «SOOTRING»:
Entry.objects.filter(Q(name__contains="Elephant") & ~Q(name__contains="SomeString"))
В некоторых случаях вы можете использовать оба метода:
Entry.objects.exclude(Q(name__contains="Elephant") & ~Q(name__contains="SomeString"))
(«Дайте мне все записи, кроме тех, кто с names
содержащий «слон», но не содержащий «SOOTRING»)
Другие советы
Вот то Справочник запросов к запросу API. exclude
кажется, делает то, что вы хотите.
Либо использовать exclude
как Хэнк предлагает или, для конкретного contains
Корпус, используйте q (имя__regex = R '! (SomeString)'), если вам действительно действительно нужно использовать filter
. Отказ Быть предупрежденным, хотя это regex
Не содержит база данных, проверьте, какой синтаксис поддерживает вашу БД первым.