В модели 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)
a=true
сначала исключает все, а затем применяетx=5
фильтр к остальным. Предполагаемый запрос требует только тех, у когоa=true
иx!=5
. Разница в том, что все те, кто сa=true
иx=5
также отфильтрованы.Ответы:
Может быть, объекты Q могут помочь в решении этой проблемы. Я никогда не использовал их, но кажется, что они могут быть сведены на нет и объединены так же, как обычные выражения Python.
Обновление: Я только что попробовал, кажется, работает довольно хорошо:
источник
Похоже, ваш запрос имеет двойной минус, вы хотите исключить все строки, где x не равно 5, то есть, другими словами, вы хотите включить все строки, где x IS 5. Я считаю, что это поможет.
Чтобы ответить на ваш конкретный вопрос, нет «не равно», но это, вероятно, потому, что в django есть методы «filter» и «exclude», так что вы всегда можете просто переключить логику, чтобы получить желаемый результат.
источник
results = Model.objects.filter(a=true).exclude(x=5)
exclude
иfilter
звонки не имели никакого значения. Порядок условий вWHERE
пункте меняется, но как это имеет значение?field=value
синтаксис запросов является обобщающим дляfield__exact=value
. То есть Django помещает операторы запроса в поля запроса в идентификаторах . Django поддерживает следующие операторы:Я уверен, что, комбинируя их с объектами Q, как предлагает Дейв Фогт, и используя
filter()
или,exclude()
как Джейсон Бейкер предлагает, вы получите именно то, что вам нужно для любого возможного запроса.источник
tg=Tag.objects.filter(user=request.user).exclude(name__regex=r'^(public|url)$')
и это работает.icontains
,iexact
и подобное расшифровывается как «игнорировать чувствительность к регистру». Это не для "обратного".exclude()
несколько терминов, вы можете составить предложение сOR
оператором, напримерexclude(Q(field1__queryop1=value1) | Q(field2__queryop2=value2))
, чтобы исключить результаты при обоих условиях.С Django 1.7 легко создать пользовательский поиск. В официальной документации Django есть
__ne
пример поиска .Сначала вам нужно создать сам поиск:
Тогда вам нужно зарегистрировать это:
И теперь вы можете использовать
__ne
поиск в ваших запросах следующим образом:источник
В Django 1.9 / 1.10 есть три варианта.
Цепь
exclude
иfilter
Используйте
Q()
объекты и~
оператораЗарегистрировать пользовательскую функцию поиска
register_lookup
Декоратор был добавлен в Django 1.8 и позволяет пользовательский LookUp как обычно:источник
В то время как с моделями, вы можете фильтровать с
=
,__gt
,__gte
,__lt
,__lte
, вы не можете использоватьne
,!=
или<>
. Тем не менее, вы можете добиться лучшей фильтрации при использовании объекта Q.Вы можете избежать цепочки
QuerySet.filter()
иQuerySet.exlude()
, и использовать это:источник
В ожидании проектного решения. Между тем, используйте
exclude()
У системы отслеживания проблем Django есть замечательная запись № 5763 под названием «Queryset не имеет« неравного »оператора фильтра» . Это примечательно тем, что (по состоянию на апрель 2016 года) он был «открыт 9 лет назад» (в каменном веке Джанго), «закрыт 4 года назад» и «последний изменился 5 месяцев назад».
Прочитайте обсуждение, это интересно. По сути, некоторые люди утверждают, что
__ne
следует добавить, в то время как другие говорят, чтоexclude()
это яснее и, следовательно, не__ne
следует быть добавлены.(Я согласен с первым, потому что последний аргумент примерно эквивалентен тому, что Python не должен иметь,
!=
потому что он есть==
иnot
уже ...)источник
Использование exclude и filter
источник
Вы должны использовать
filter
иexclude
нравится этоисточник
Последний бит кода исключит все объекты, где x! = 5 и a - True. Попробуй это:
Помните, что знак = в приведенной выше строке присваивает False параметру a, а номер 5 - параметру x. Это не проверка на равенство. Таким образом, на самом деле нет никакого способа использовать символ! = В вызове запроса.
источник
results = Model.objects.filter(a__in=[False,None],x=5)
источник
Django-model-values (раскрытие: автор) обеспечивает реализацию поиска NotEqual , как в этом ответе . Это также обеспечивает синтаксическую поддержку для этого:
источник
То , что вы ищете, все объекты , которые имеют либо
a=false
илиx=5
. В Django|
служитOR
оператором между наборами запросов:источник
Это даст желаемый результат.
для не равных вы можете использовать
~
на равный запрос. очевидно,Q
может быть использован для достижения равного запроса.источник
Q(a=True) and ~Q(x=5)
будет вычисляться в~Q(x=5)
качестве аргументов.exclude
. Пожалуйста, прочитайте: docs.python.org/3/reference/expressions.html#boolean-operations и docs.python.org/3/reference/… .Остерегайтесь множества неправильных ответов на этот вопрос!
Логика Джерарда верна, хотя он вернет список, а не набор запросов (что может не иметь значения).
Если вам нужен набор запросов, используйте Q:
источник