EmptyResultSet
Исключение EmptyResultSet используется в Django ORM для
обозначения ситуаций, когда запрос заведомо не может вернуть
результат. Это исключение наследуется от django.core.exceptions.EmptyResultSet
и возникает внутри механизма построения запросов при
обнаружении невозможности получения данных. В отличие от
DoesNotExist, которое бросается при попытке получить
конкретный объект, EmptyResultSet сигнализирует о том,
что условие фильтрации изначально не может быть выполнено,
и запрос даже не отправляется в базу данных.
Синтаксис
Исключение не вызывается напрямую в пользовательском коде, а генерируется внутри Django при выполнении следующих операций:
# Исключение может быть перехвачено:
try:
queryset = Model.objects.filter(condition=False)
# При определенных условиях может быть выброшено EmptyResultSet
except EmptyResultSet:
# Обработка ситуации пустого результата
pass
Пример
Рассмотрим ситуацию, когда условие фильтрации заведомо не может быть выполнено, например, при использовании несуществующего значения в поле с выбором:
from 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("Запрос не может вернуть результаты")
Результат выполнения кода:
"Запрос не может вернуть результаты"
Пример
Исключение часто возникает при использовании методов
exclude с противоречивыми условиями. Например,
если мы исключаем все возможные значения поля:
from 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("Нет категорий для исключения")
Результат выполнения кода:
"Нет категорий для исключения"
Пример
При использовании метода values или values_list
на заведомо пустом QuerySet, исключение может быть
выброшено до выполнения запроса:
from 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("Нет пользователей с таким возрастом")
Результат выполнения кода:
"Нет пользователей с таким возрастом"
Смотрите также
-
исключение
DoesNotExist,
которое возникает при попытке получить несуществующий объект -
исключение
MultipleObjectsReturned,
которое возникает при получении более одного объекта -
исключение
FullResultSet,
которое сигнализирует о возврате всех записей -
исключение
FieldError,
которое возникает при ошибках в полях запроса