Фильтрация пустых или пустых имен в наборе запросов - PullRequest
419 голосов
/ 10 мая 2009

У меня есть first_name, last_name & alias (необязательно), которые мне нужно искать. Итак, мне нужен запрос, чтобы дать мне все имена, для которых установлен псевдоним.

Только если бы я мог сделать:

Name.objects.filter(alias!="")

Итак, что эквивалентно вышесказанному?

Ответы [ 6 ]

763 голосов
/ 10 мая 2009

Вы можете сделать это:

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 являются истинными, исключаются, поэтому мы получаем все строки, в которых оба поля не являются истинными. Сгенерированный код SQL будет выглядеть примерно так:

SELECT * FROM Name WHERE NOT (some_field = TRUE AND other_field = TRUE)

В качестве альтернативы, если ваша логика более сложна, вы можете использовать объекты Q Джанго :

from django.db.models import Q
Name.objects.exclude(Q(alias__isnull=True) | Q(alias__exact=''))

Для получения дополнительной информации см. эту страницу и эту страницу в документации Django.

В качестве отступления: мои примеры SQL - всего лишь аналогия - фактический сгенерированный код SQL, вероятно, будет выглядеть по-другому. Вы получите более глубокое понимание того, как работают запросы Django, фактически посмотрев SQL, который они генерируют.

37 голосов
/ 23 февраля 2011
Name.objects.filter(alias__gt='',alias__isnull=False)
35 голосов
/ 04 июня 2009

Во-первых, документы Django настоятельно рекомендуют не использовать значения NULL для строковых полей, таких как CharField или TextField. Прочитайте документацию для объяснения:

https://docs.djangoproject.com/en/dev/ref/models/fields/#null

Решение: Я думаю, вы также можете связать воедино методы на QuerySets. Попробуйте это:

Name.objects.exclude(alias__isnull=True).exclude(alias="")

Это должно дать вам набор, который вы ищете.

4 голосов
/ 06 марта 2016

Из Django 1.8,

from django.db.models.functions import Length

Name.objects.annotate(alias_length=Length('alias')).filter(alias_length__gt=0)
0 голосов
/ 10 октября 2018

это еще один простой способ сделать это.

Name.objects.exclude(alias=None)
0 голосов
/ 08 мая 2018

Вы можете просто сделать это:

Name.objects.exclude(alias="").exclude(alias=None)

Это действительно так просто. filter используется для сопоставления, а exclude - для сопоставления всего, кроме того, что указано. Это оценило бы в SQL как NOT alias='' AND alias IS NOT NULL.

...