Как выполнить фильтрацию запросов в Django по условию "не равно"?
В Django QuerySet я заметил, что для сравнительных значений существуют операторы __gt
и __lt
, но есть ли оператор __ne
или !=
(т.е. не равно)? Мне нужно отфильтровать значения с использованием условия "не равно". Например, для следующей модели:
Model:
bool a;
int x;
Я хотел бы выполнить такой запрос:
results = Model.objects.exclude(a=True, x!=5)
Однако синтаксис с !=
неверен. Я также пробовал использовать __ne
, но это тоже не сработало.
В итоге я использовал следующий вариант:
results = Model.objects.exclude(a=True, x__lt=5).exclude(a=True, x__gt=5)
Может ли кто подсказать более элегантное решение для фильтрации по условию "не равно"?
5 ответ(ов)
Вы можете фильтровать модели с помощью операторов =
, __gt
, __gte
, __lt
, __lte
, но операторов ne
или !=
использовать нельзя. Тем не менее, вы можете достичь более гибкой фильтрации, используя объект Q.
Вместо того чтобы комбинировать QuerySet.filter()
и QuerySet.exclude()
, вы можете использовать следующий подход:
from django.db.models import Q
object_list = QuerySet.filter(~Q(field='не нужно'), field='нужно')
Таким образом, вы сможете получить нужные результаты более элегантно и эффективно.
Вы можете использовать метод exclude
вместе с filter
для получения результатов, которые соответствуют определённому критерию, одновременно исключая те, которые не соответствуют другому критерию. В вашем примере вы фильтруете объекты модели Model
, чтобы найти те, где значение поля x
равно 5, и исключаете те записи, где поле a
имеет значение true
.
Вот как это выглядит в коде:
results = Model.objects.filter(x=5).exclude(a=True)
В результате вы получите queryset, который содержит только те объекты модели, которые соответствуют фильтру по полю x
, и при этом у которых поле a
не равно true
. Это мощный способ комбинирования условий запроса в Django.
Вы можете использовать filter
и exclude
следующим образом:
results = Model.objects.exclude(a=True).filter(x=5)
Здесь exclude
исключает записи, где поле a
равно True
, а затем filter
выбирает записи, где поле x
равно 5.
Это даст вам желаемый результат.
from django.db.models import Q
results = Model.objects.exclude(Q(a=True) & ~Q(x=5))
Для неравенства вы можете использовать ~
вместе с запросом на равенство. Очевидно, что Q
можно использовать для создания запроса на равенство.
Вы ищете все объекты, у которых a=false
или x=5
. В Django оператор |
используется как оператор ИЛИ между queryset-ами:
results = Model.objects.filter(a=False) | Model.objects.filter(x=5)
Обратите внимание, что в Django необходимо использовать False
с заглавной буквы, чтобы корректно указать логическое значение.
В чем разница между null=True и blank=True в Django?
Существует ли список временных зон Pytz?
Превысил ли Django 100 тыс. посещений в день? [закрыто]
Почему используется string.join(list), а не list.join(string)?
Создание словаря с помощью генератора словарей