Фильтрация для пустых или NULL имен в наборе запросов
У меня есть first_name
, last_name
& alias
(необязательно), который мне нужно искать. Итак, мне нужен запрос, чтобы дать мне все имена, для которых установлен псевдоним.
Только если бы я мог сделать:
Name.objects.filter(alias!="")
Итак, что эквивалентно вышесказанному?
Ответы
Ответ 1
Вы можете сделать это:
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, который они генерируют.
Ответ 2
Name.objects.filter(alias__gt='',alias__isnull=False)
Ответ 3
Во-первых, документы Django настоятельно рекомендуют не использовать значения NULL для строковых полей, таких как CharField или TextField. Прочтите документацию для объяснения:
https://docs.djangoproject.com/en/dev/ref/models/fields/#null
Решение:
Думаю, вы также можете объединить методы на QuerySets. Попробуйте следующее:
Name.objects.exclude(alias__isnull=True).exclude(alias="")
Это должно дать вам набор, который вы ищете.
Ответ 4
Из Django 1.8,
from django.db.models.functions import Length
Name.objects.annotate(alias_length=Length('alias')).filter(alias_length__gt=0)
Ответ 5
Чтобы избежать распространенных ошибок при использовании exclude
, помните:
Вы не можете добавить несколько условий в блок exclude(), например filter
. Чтобы исключить несколько условий, вы должны использовать несколько exclude()
пример
Неверно:
User.objects.filter(email='[email protected] '). Exclude (profile__nick_name =' ', profile__avt =' ')
Исправить:
User.objects.filter(email='[email protected] '). Исключить (profile__nick_name =' '). Исключить (profile__avt =' ')
Ответ 6
Вы можете просто сделать это:
Name.objects.exclude(alias="").exclude(alias=None)
Это действительно так просто. filter
используется для сопоставления, а exclude
- для сопоставления всего, кроме того, что он указывает. В SQL это будет оцениваться как NOT alias='' AND alias IS NOT NULL
.
Ответ 7
это еще один простой способ сделать это.
Name.objects.exclude(alias=None)