Как сделать неравное в фильтрации наборов запросов Django? - PullRequest
570 голосов
/ 26 марта 2009

В модели QuerySets Django я вижу, что есть __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)

Ответы [ 14 ]

5 голосов
/ 13 января 2018

Django-model-values ​​ (раскрытие: автор) обеспечивает реализацию поиска NotEqual , как в этот ответ . Он также обеспечивает синтаксическую поддержку:

from model_values import F
Model.objects.exclude(F.x != 5, a=True)
5 голосов
/ 22 февраля 2017

results = Model.objects.filter(a = True).exclude(x = 5)
Генерирует этот sql:
select * from tablex where a != 0 and x !=5
SQL зависит от того, как представлено ваше поле True / False, и от механизма базы данных. Код Django - это все, что вам нужно.
5 голосов
/ 27 июня 2016

То, что вы ищете, это все объекты, которые имеют a=false или x=5. В Django | служит оператором OR между наборами запросов:

results = Model.objects.filter(a=false)|Model.objects.filter(x=5)
0 голосов
/ 14 марта 2019

Остерегайтесь множества неправильных ответов на этот вопрос!

Логика Джерарда верна, хотя он вернет список, а не набор запросов (что может не иметь значения).

Если вам нужен набор запросов, используйте Q:

from django.db.models import Q
results = Model.objects.filter(Q(a=false) | Q(x=5))
...