Ответы:
Вы могли бы сделать это:
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
для объединения условий. Я отредактирую свой ответ, чтобы уточнить.
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, я думаю, документы справляются лучше, чем я.
Name.objects.filter(alias__gt='',alias__isnull=False)
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. Попробуй это:
Name.objects.exclude(alias__isnull=True).exclude(alias="")
Это должно дать вам набор, который вы ищете.
Из Джанго 1.8,
from django.db.models.functions import Length
Name.objects.annotate(alias_length=Length('alias')).filter(alias_length__gt=0)
Чтобы избежать распространенных ошибок при использовании exclude
, помните:
Вы не можете добавить несколько условий в блок exclude (), например filter
. Чтобы исключить несколько условий, вы должны использовать несколько exclude ()
пример
Неверно :
User.objects.filter (email='example@example.com '). Exclude (profile__nick_name =' ', profile__avt =' ')
Исправить :
User.objects.filter (email='example@example.com '). Исключить (profile__nick_name =' '). Исключить (profile__avt =' ')
Вы можете просто сделать это:
Name.objects.exclude(alias="").exclude(alias=None)
Это действительно так просто. filter
используется для сопоставления и exclude
сопоставления всего, кроме того, что указано. Это оценило бы в SQL как NOT alias='' AND alias IS NOT NULL
.
alias=""
) и NULL ( alias=None
). Ваш будет включать в себя случаи с Name(alias=None)
.
.filter(alias!="")
но не названию. Я отредактировал свой ответ. Однако символьные поля не должны разрешать значения NULL и использовать пустую строку для ненулевого значения (согласно соглашению).
OR
(только в этом случае), он производит SQLAND
. См. Эту страницу для справки: docs.djangoproject.com/en/dev/topics/db/queries/… Преимущество цепочки заключается в том, что вы можете смешиватьexclude
иfilter
моделировать сложные условия запроса. Если вы хотите смоделировать реальный SQL,OR
вы должны использовать объект Django Q: docs.djangoproject.com/en/dev/topics/db/queries/… Пожалуйста, отредактируйте ваши изменения, чтобы отразить это, так как ответ серьезно вводит в заблуждение ,