Фильтрация для пустых или 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)