У меня есть first_name, last_name и псевдоним (необязательно), которые мне нужно найти. Поэтому мне нужен запрос, чтобы дать мне все имена, у которых есть набор псевдонимов.
Только если бы я мог:
Name.objects.filter(alias!="")
Итак, что эквивалентно приведенному выше?
Вы можете сделать это:
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, который они генерируют.
Во-первых, документы Django настоятельно рекомендуют не использовать значения NULL для строковых полей, таких как CharField или TextField. Прочтите документацию для объяснения:
https://docs.djangoproject.com/en/dev/ref/models/fields/#null
Решение: Думаю, вы также можете объединить методы на QuerySets. Попробуйте следующее:
Name.objects.exclude(alias__isnull=True).exclude(alias="")
Это должно дать вам набор, который вы ищете.
Name.objects.filter(alias__gt='',alias__isnull=False)
alias__isnull=False
является избыточным. Если поле имеет значение Null
то оно обязательно будет исключено первым предложением?
Из Django 1.8,
from django.db.models.functions import Length
Name.objects.annotate(alias_length=Length('alias')).filter(alias_length__gt=0)
OR
(только в этом случае), он производит SQLAND
. См. Эту страницу для справки: docs.djangoproject.com/en/dev/topics/db/queries/… Преимущество цепочки заключается в том, что вы можете смешиватьexclude
иfilter
для моделирования сложных условий запроса. Если вы хотите смоделировать реальный SQLOR
вы должны использовать объект Django Q: docs.djangoproject.com/en/dev/topics/db/queries/… Пожалуйста, отредактируйте ваши изменения, чтобы отразить это, поскольку ответ сильно вводит в заблуждение, так как стоит.OR
для объединения условий. Я отредактирую свой ответ, чтобы уточнить.