Відповіді:
Ви можете це зробити:
Name.objects.exclude(alias__isnull=True)
Якщо вам потрібно виключити нульові значення та порожні рядки, кращим способом зробити це - з'єднати між собою такі умови, як:
Name.objects.exclude(alias__isnull=True).exclude(alias__exact='')
Об'єднання цих методів разом, в основному, перевіряє кожну умову незалежно: у наведеному вище прикладі ми виключаємо рядки, де alias
є або null, або порожній рядок, тому ви отримуєте всі Name
об'єкти, які мають не-null, не порожнє 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-об'єкти Django :
from django.db.models import Q
Name.objects.exclude(Q(alias__isnull=True) | Q(alias__exact=''))
Для отримання додаткової інформації див. Цю сторінку та цю сторінку в документах Django.
Як осторонь: Мої приклади SQL - це лише аналогія - фактично створений код SQL, ймовірно, буде виглядати інакше. Ви отримаєте більш глибоке розуміння того, як працюють запити Django, насправді переглянувши SQL, який вони генерують.
OR
умов. Я відредагую свою відповідь, щоб уточнити.
NOT (A AND B)
це рівнозначно NOT A OR NOT B
. Я думаю, що це заплутує нових розробників Django, які знають SQL, але незнайомі з ORM.
AND
перший запит у те, OR
що ви використовуєте exclude
. У загальному випадку, мабуть, правильніше думати про ланцюг як а THEN
, тобто exclude(A) THEN exclude(B)
. Вибачте за сувору мову вище. Ваша відповідь справді хороша, але я переживаю, що нові розробники сприймуть вашу відповідь занадто загально.
AND
і OR
може бути корисним для того, хто приходить до Джанго зі складу SQL. Для глибшого розуміння Джанго, я думаю, що документи роблять кращу роботу, ніж я можу.
Name.objects.filter(alias__gt='',alias__isnull=False)
alias__isnull=False
стан є зайвим. Якщо поле, Null
безумовно, буде виключено першим пунктом?
alias__gt
було єдиним, що працювало для стовпців типу JSON, де я хотів виключити порожні рядки з типу JSON, як {'something:''}
. Таким робочим синтаксисом є:jsoncolumnname__something__gt=''
По-перше, документи Django настійно рекомендують не використовувати значення NULL для полів на основі рядків, таких як CharField або TextField. Прочитайте документацію для пояснення:
https://docs.djangoproject.com/en/dev/ref/models/fields/#null
Рішення: Я думаю, ви також можете зв'язати між собою методи на QuerySets. Спробуйте це:
Name.objects.exclude(alias__isnull=True).exclude(alias="")
Це повинно дати вам набір, який ви шукаєте.
Від Джанго 1,8,
from django.db.models.functions import Length
Name.objects.annotate(alias_length=Length('alias')).filter(alias_length__gt=0)
Щоб уникнути поширених помилок при використанні exclude
, пам’ятайте:
Ви не можете додати кілька умов у блок виключення (), як filter
. Щоб виключити декілька умов, потрібно використовувати кілька виключити ()
Приклад
Неправильно :
User.objects.filter (email='example@example.com '). Виключити (profile__nick_name =' ', profile__avt =' ')
Правильно :
User.objects.filter (email='example@example.com '). Виключити (profile__nick_name =' '). Виключити (profile__avt =' ')
Ви можете просто зробити це:
Name.objects.exclude(alias="").exclude(alias=None)
Це насправді так просто. filter
використовується для узгодження і exclude
має відповідати всьому, окрім того, що він вказує. Це оцінюється в SQL як NOT alias='' AND alias IS NOT NULL
.
alias=""
) та NULL ( alias=None
) псевдоніми із запиту. Ваші включатимуть екземпляри з Name(alias=None)
.
.filter(alias!="")
але не назві. Я відредагував свою відповідь. Однак поля символів не повинні дозволяти значенням NULL і використовувати порожню рядок для не значення (згідно з умовами).
OR
(лише в цьому випадку), він виробляє SQLAND
. Перегляньте цю сторінку для довідок: docs.djangoproject.com/en/dev/topics/db/queries/… Перевага ланцюга полягає в тому, що ви можете змішуватиexclude
таfilter
моделювати складні умови запиту. Якщо ви хочете змоделювати справжній SQL,OR
ви повинні використовувати об’єкт Django Q: docs.djangoproject.com/en/dev/topics/db/queries/…. Будь ласка, відредагуйте свою редакцію, щоб відобразити це, оскільки відповідь сильно оманливий, оскільки вона є. .