Вы можете сделать это:
Name.objects.exclude(alias__isnull=True)
Если необходимо исключить нулевые значения и пустые строки, предпочтительный способ сделать так, чтобы цепь вместе условия, как так:
Name.objects.exclude(alias__isnull=True).exclude(alias__exact='')
Объединение этих методов вместе в основном проверяет каждое условие независимо: в приведенном выше примере мы исключаем строки, в которых alias
либо имеет значение null , либо пустую строку, поэтому вы получаете все объекты Name
, у которых есть не пустое, не пустое поле alias
. Сгенерированный SQL будет выглядеть примерно так:
SELECT * FROM Name WHERE alias IS NOT NULL AND alias != ""
Вы также можете передать несколько аргументов в одном вызове exclude
, который будет гарантировать, что только объекты, которые отвечают каждый условие получить исключены:
Name.objects.exclude(some_field=True, other_field=True)
Здесь строки, в которых иother_field
истинны, исключаются, поэтому мы получаем все строки, в которых оба поля не являются истинными. Сгенерированный SQL-код будет выглядеть немного как это:
SELECT * FROM Name WHERE NOT (some_field = TRUE AND other_field = TRUE)
В качестве альтернативы, если ваша логика является более сложной, чем вы могли бы использовать Джанго Q objects:
from django.db.models import Q
Name.objects.exclude(Q(alias__isnull=True) | Q(alias__exact=''))
Для получения дополнительной информации см this page и this page в документы Django.
Как в стороне: мои примеры SQL - это просто аналогия - реально созданный код SQL, вероятно, будет отличаться. Вы получите более глубокое представление о том, как работают Django-запросы, фактически просматривая SQL, который они создают.
Я считаю, что ваше изменение неверно: Цепочный фильтр НЕ автоматически создает SQL 'OR' (только в этом случае), он создает SQL' AND'. См. Эту страницу для справки: https://docs.djangoproject.com/en/dev/topics/db/queries/#chaining-filters Преимущество цепочки заключается в том, что вы можете смешивать 'exclude' и' filter' с моделью сложных условий запроса. Если вы хотите смоделировать настоящий SQL 'OR', вы должны использовать объект Django Q: https://docs.djangoproject.com/en/dev/topics/db/queries/#complex-lookups-with-q- объекты Пожалуйста, отредактируйте свое редактирование, чтобы отразить это, так как ответ серьезно вводит в заблуждение, поскольку он стоит. – shezi
@shezi: Я имел в виду это скорее как аналогию - я не имел в виду, что реальный код SQL гарантированно использует «OR» для слияния условий. Я отредактирую свой ответ, чтобы уточнить. –
Имейте в виду, что есть разные способы представления этой логики - например, 'NOT (A AND B)' эквивалентно 'NOT A ИЛИ NOT B'. Я думаю, что это путает новых разработчиков Django, которые знают SQL, но не знакомы с ORM. –