Вы могли бы сделать это:
Name.objects.exclude(alias__isnull=True)
Если вам необходимо исключить нулевые значения и пустые строки, предпочтительный способ сделать это - связать воедино следующие условия:
Name.objects.exclude(alias__isnull=True).exclude(alias__exact='')
Объединение этих методов в одно целое проверяет каждое условие независимо: в приведенном выше примере мы исключаем строки, в которых alias
есть либо пустая, либо пустая строка, поэтому вы получаете все Name
объекты, которые имеют не пустое и не пустое alias
поле. Сгенерированный SQL будет выглядеть примерно так:
SELECT * FROM Name WHERE alias IS NOT NULL AND alias != ""
Вы также можете передать несколько аргументов в один вызов exclude
, что позволит исключить только те объекты, которые соответствуют каждому условию:
Name.objects.exclude(some_field=True, other_field=True)
Здесь строки, в которых some_field
и other_field
true, исключаются, поэтому мы получаем все строки, в которых оба поля не являются истинными. Сгенерированный код SQL будет выглядеть примерно так:
SELECT * FROM Name WHERE NOT (some_field = TRUE AND other_field = TRUE)
В качестве альтернативы, если ваша логика более сложна, вы можете использовать объекты Django Q :
from django.db.models import Q
Name.objects.exclude(Q(alias__isnull=True) | Q(alias__exact=''))
Для получения дополнительной информации см. Эту страницу и эту страницу в Django документах.
В качестве отступления: мои примеры SQL - просто аналогия - фактически сгенерированный код SQL, вероятно, будет выглядеть иначе. Вы получите более глубокое понимание того, как работают запросы Django, фактически посмотрев SQL, который они генерируют.
OR
(только в этом случае), он производит SQLAND
. См. Эту страницу для справки: docs.djangoproject.com/en/dev/topics/db/queries/… Преимущество цепочки заключается в том, что вы можете смешиватьexclude
иfilter
моделировать сложные условия запроса. Если вы хотите смоделировать реальный SQL,OR
вы должны использовать объект Django Q: docs.djangoproject.com/en/dev/topics/db/queries/… Пожалуйста, отредактируйте ваши изменения, чтобы отразить это, так как ответ серьезно вводит в заблуждение ,OR
для объединения условий. Я отредактирую свой ответ, чтобы уточнить.NOT (A AND B)
эквивалентноNOT A OR NOT B
. Я думаю, что это сбивает с толку новых разработчиков Django, которые знают SQL, но не знакомы с ORM.AND
первый запрос вOR
потому что вы используетеexclude
. В общем случае, это, вероятно , правильнее было бы думать цепочки , какTHEN
, напримерexclude(A) THEN exclude(B)
. Извините за резкий язык выше. Ваш ответ действительно хорош, но я беспокоюсь о том, что новые разработчики воспримут ваш ответ слишком широко.AND
иOR
может быть полезным для тех, кто приезжает в Django из фона SQL. Для более глубокого понимания Django, я думаю, документы справляются лучше, чем я.источник
alias__isnull=False
условие является избыточным. Если полеNull
обязательно будет исключено первым предложением?alias__gt
была единственная вещь, которая работала для столбцов типа JSON, где я хотел исключить пустые строки из типа JSON{'something:''}
. Так работает синтаксис:jsoncolumnname__something__gt=''
Во-первых, документы Django настоятельно рекомендуют не использовать значения NULL для строковых полей, таких как CharField или TextField. Прочитайте документацию для объяснения:
https://docs.djangoproject.com/en/dev/ref/models/fields/#null
Решение: я думаю, что вы также можете объединить методы в QuerySets. Попробуй это:
Это должно дать вам набор, который вы ищете.
источник
Из Джанго 1.8,
источник
Чтобы избежать распространенных ошибок при использовании
exclude
, помните:Вы не можете добавить несколько условий в блок exclude (), например
filter
. Чтобы исключить несколько условий, вы должны использовать несколько exclude ()пример
источник
Вы можете просто сделать это:
Это действительно так просто.
filter
используется для сопоставления иexclude
сопоставления всего, кроме того, что указано. Это оценило бы в SQL какNOT alias='' AND alias IS NOT NULL
.источник
alias=""
) и NULL (alias=None
). Ваш будет включать в себя случаи сName(alias=None)
..filter(alias!="")
но не названию. Я отредактировал свой ответ. Однако символьные поля не должны разрешать значения NULL и использовать пустую строку для ненулевого значения (согласно соглашению).это еще один простой способ сделать это.
источник
None
это не то же самое, что""
.