EmptyResultSet

Исключение EmptyResultSet используется в Django ORM для обозначения ситуаций, когда запрос заведомо не может вернуть результат. Это исключение наследуется от django.core.exceptions.EmptyResultSet и возникает внутри механизма построения запросов при обнаружении невозможности получения данных. В отличие от DoesNotExist, которое бросается при попытке получить конкретный объект, EmptyResultSet сигнализирует о том, что условие фильтрации изначально не может быть выполнено, и запрос даже не отправляется в базу данных.

Синтаксис

Исключение не вызывается напрямую в пользовательском коде, а генерируется внутри Django при выполнении следующих операций:

python# Исключение может быть перехвачено:
try:
  queryset = Model.objects.filter(condition=False)
  # При определенных условиях может быть выброшено EmptyResultSet
except EmptyResultSet:
  # Обработка ситуации пустого результата
  pass

Пример

Рассмотрим ситуацию, когда условие фильтрации заведомо не может быть выполнено, например, при использовании несуществующего значения в поле с выбором:

pythonfrom django.core.exceptions import EmptyResultSet
from myapp.models import Article

try:
  # Статьи с несуществующим статусом
  articles = Article.objects.filter(status='archived')
  # Если статус 'archived' отсутствует в choices,
  # может быть сгенерировано EmptyResultSet
  print(articles.exists())
except EmptyResultSet:
  print("Запрос не может вернуть результаты")

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

python"Запрос не может вернуть результаты"

Пример

Исключение часто возникает при использовании методов exclude с противоречивыми условиями. Например, если мы исключаем все возможные значения поля:

pythonfrom django.core.exceptions import EmptyResultSet
from myapp.models import Category

try:
  # Исключаем все категории, что делает запрос пустым
  categories = Category.objects.exclude(
    id__in=Category.objects.values_list('id', flat=True)
  )
  # Django может сгенерировать EmptyResultSet
  print(categories.count())
except EmptyResultSet:
  print("Нет категорий для исключения")

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

python"Нет категорий для исключения"

Пример

При использовании метода values или values_list на заведомо пустом QuerySet, исключение может быть выброшено до выполнения запроса:

pythonfrom django.core.exceptions import EmptyResultSet
from myapp.models import User

try:
  # Пользователи с несуществующим значением поля
  users = User.objects.filter(
    age__gt=200
  ).values('username')
  # Если возраст > 200 невозможен, будет EmptyResultSet
  for user in users:
    print(user)
except EmptyResultSet:
  print("Нет пользователей с таким возрастом")

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

python"Нет пользователей с таким возрастом"

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

  • исключение DoesNotExist,
    которое возникает при попытке получить несуществующий объект
  • исключение MultipleObjectsReturned,
    которое возникает при получении более одного объекта
  • исключение FullResultSet,
    которое сигнализирует о возврате всех записей
  • исключение FieldError,
    которое возникает при ошибках в полях запроса