Лукап isnull
Лукап isnull применяется к полям модели в запросах
filter и exclude. Он позволяет отбирать записи,
где значение указанного поля является NULL (пустым) или не
является NULL. Аргумент передается в виде булева значения:
True для поиска NULL-значений и False для
поиска не-NULL значений.
Синтаксис
Model.objects.filter(field__isnull=True)
Model.objects.filter(field__isnull=False)
Пример
Допустим, у нас есть модель статьи с полем 'published_at',
которое может быть пустым, если статья еще не опубликована.
Найдем все статьи, у которых дата публикации не указана:
from myapp.models import Article
unpublished_articles = Article.objects.filter(published_at__isnull=True)
for article in unpublished_articles:
print(article.title)
Результат выполнения кода:
"Draft post"
"Pending review"
Пример
Теперь найдем все опубликованные статьи, у которых дата публикации заполнена:
from myapp.models import Article
published_articles = Article.objects.filter(published_at__isnull=False)
for article in published_articles:
print(article.title)
Результат выполнения кода:
"First post"
"Second post"
"Third post"
Пример
Лукап isnull можно комбинировать с другими условиями
в одном запросе. Например, найдем неопубликованные статьи
с определенным автором:
from myapp.models import Article
unpublished_by_user = Article.objects.filter(
author__username="john_doe",
published_at__isnull=True
)
for article in unpublished_by_user:
print(f"{article.title} - {article.author.username}")
Результат выполнения кода:
"Draft by John" - "john_doe"
"Work in progress" - "john_doe"
Пример
Используем exclude вместе с isnull, чтобы
исключить записи с пустыми значениями:
from myapp.models import Article
articles_with_description = Article.objects.exclude(description__isnull=True)
for article in articles_with_description:
print(f"{article.title} - {article.description[:20]}...")
Результат выполнения кода:
"Post 1" - "This is a descripti..."
"Post 2" - "Short description..."
Пример
Лукап isnull работает не только с полями дат, но и с
любыми типами полей, включая строковые, числовые и внешние
ключи. Рассмотрим пример с полем внешнего ключа:
from myapp.models import Article
articles_without_category = Article.objects.filter(category__isnull=True)
print(f"Articles without category: {articles_without_category.count()}")
Результат выполнения кода:
"Articles without category: 5"