9

Как выполнить фильтрацию запросов в Django по условию "не равно"?

12

В 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 ответ(ов)

0

Вы можете фильтровать модели с помощью операторов =, __gt, __gte, __lt, __lte, но операторов ne или != использовать нельзя. Тем не менее, вы можете достичь более гибкой фильтрации, используя объект Q.

Вместо того чтобы комбинировать QuerySet.filter() и QuerySet.exclude(), вы можете использовать следующий подход:

from django.db.models import Q
object_list = QuerySet.filter(~Q(field='не нужно'), field='нужно')

Таким образом, вы сможете получить нужные результаты более элегантно и эффективно.

0

Вы можете использовать метод exclude вместе с filter для получения результатов, которые соответствуют определённому критерию, одновременно исключая те, которые не соответствуют другому критерию. В вашем примере вы фильтруете объекты модели Model, чтобы найти те, где значение поля x равно 5, и исключаете те записи, где поле a имеет значение true.

Вот как это выглядит в коде:

results = Model.objects.filter(x=5).exclude(a=True)

В результате вы получите queryset, который содержит только те объекты модели, которые соответствуют фильтру по полю x, и при этом у которых поле a не равно true. Это мощный способ комбинирования условий запроса в Django.

0

Вы можете использовать filter и exclude следующим образом:

results = Model.objects.exclude(a=True).filter(x=5)

Здесь exclude исключает записи, где поле a равно True, а затем filter выбирает записи, где поле x равно 5.

0

Это даст вам желаемый результат.

from django.db.models import Q
results = Model.objects.exclude(Q(a=True) & ~Q(x=5))

Для неравенства вы можете использовать ~ вместе с запросом на равенство. Очевидно, что Q можно использовать для создания запроса на равенство.

0

Вы ищете все объекты, у которых a=false или x=5. В Django оператор | используется как оператор ИЛИ между queryset-ами:

results = Model.objects.filter(a=False) | Model.objects.filter(x=5)

Обратите внимание, что в Django необходимо использовать False с заглавной буквы, чтобы корректно указать логическое значение.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь