Лукап isnull

Лукап isnull применяется к полям модели в запросах filter и exclude. Он позволяет отбирать записи, где значение указанного поля является NULL (пустым) или не является NULL. Аргумент передается в виде булева значения: True для поиска NULL-значений и False для поиска не-NULL значений.

Синтаксис

pythonModel.objects.filter(field__isnull=True)
Model.objects.filter(field__isnull=False)

Пример

Допустим, у нас есть модель статьи с полем 'published_at', которое может быть пустым, если статья еще не опубликована. Найдем все статьи, у которых дата публикации не указана:

pythonfrom myapp.models import Article

unpublished_articles = Article.objects.filter(published_at__isnull=True)
for article in unpublished_articles:
  print(article.title)

Результат выполнения кода:

python"Draft post"
"Pending review"

Пример

Теперь найдем все опубликованные статьи, у которых дата публикации заполнена:

pythonfrom myapp.models import Article

published_articles = Article.objects.filter(published_at__isnull=False)
for article in published_articles:
  print(article.title)

Результат выполнения кода:

python"First post"
"Second post"
"Third post"

Пример

Лукап isnull можно комбинировать с другими условиями в одном запросе. Например, найдем неопубликованные статьи с определенным автором:

pythonfrom 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}")

Результат выполнения кода:

python"Draft by John" - "john_doe"
"Work in progress" - "john_doe"

Пример

Используем exclude вместе с isnull, чтобы исключить записи с пустыми значениями:

pythonfrom 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]}...")

Результат выполнения кода:

python"Post 1" - "This is a descripti..."
"Post 2" - "Short description..."

Пример

Лукап isnull работает не только с полями дат, но и с любыми типами полей, включая строковые, числовые и внешние ключи. Рассмотрим пример с полем внешнего ключа:

pythonfrom myapp.models import Article

articles_without_category = Article.objects.filter(category__isnull=True)
print(f"Articles without category: {articles_without_category.count()}")

Результат выполнения кода:

python"Articles without category: 5"

Смотрите также

  • лукап exact,
    который выполняет точное сравнение значения поля
  • лукап gt,
    который находит записи со значением больше указанного
  • лукап lt,
    который находит записи со значением меньше указанного
  • метод filter,
    который выполняет фильтрацию QuerySet