Как выполнить фильтрацию запросов в 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 с заглавной буквы, чтобы корректно указать логическое значение.
"_set" в объекте queryset в Django
В чем разница между null=True и blank=True в Django?
Как временно отключить ограничение внешнего ключа в MySQL?
Как объединить несколько QuerySet в Django?
Как отобразить все поля модели с помощью ModelSerializer?