Исключение FullResultSet
Исключение FullResultSet относится к подсистеме работы с QuerySet и используется внутри механизмов оптимизации запросов Django. Оно наследуется от EmptyResultSet и сигнализирует о том, что результат запроса должен содержать все записи, а не пустое множество. Это исключение обычно возбуждается в ситуациях, когда условия фильтрации таковы, что они не ограничивают выборку, и базе данных необходимо вернуть полный набор данных.
Синтаксис
from django.core.exceptions import EmptyResultSet
class FullResultSet(EmptyResultSet):
pass
Исключение FullResultSet не требует специального импорта из отдельного модуля - оно доступно через django.core.exceptions. В большинстве случаев разработчики не возбуждают это исключение вручную, а обрабатывают его при необходимости.
Пример . Использование в оптимизации запросов
Рассмотрим ситуацию, когда метод values_list с флагом flat может возбудить исключение FullResultSet:
from myapp.models import Article
from django.core.exceptions import FullResultSet
try:
titles = Article.objects.values_list('title', flat=True)
# Здесь может быть оптимизация, которая возбуждает FullResultSet
except FullResultSet:
print("FullResultSet: Запрос вернет все записи")
Результат выполнения кода:
"FullResultSet: Запрос вернет все записи"
Пример . Обработка исключения
Продемонстрируем обработку исключения FullResultSet в пользовательском коде при работе с оптимизированными запросами:
from myapp.models import Article
from django.core.exceptions import FullResultSet
def get_all_titles():
try:
# Оптимизированный запрос может возбудить FullResultSet
return list(Article.objects.values_list('title', flat=True))
except FullResultSet:
# Если запрос должен вернуть все записи
return ["Full result set detected"]
res = get_all_titles()
print(res)
Результат выполнения кода:
["Full result set detected"]
Обратите внимание, что в реальных проектах FullResultSet редко используется напрямую - обычно это внутреннее исключение для оптимизации запросов.
Пример . В пользовательском коде
Хотя исключение не предназначено для ручного возбуждения, разработчик может использовать его в своей логике для проверки полноты выборки:
from myapp.models import Category
from django.core.exceptions import FullResultSet
class QueryProcessor:
def process_query(self, queryset):
try:
# Попытка выполнить оптимизированный запрос
data = queryset.values('name')
raise FullResultSet("Все записи будут возвращены")
except FullResultSet as e:
print(f"Обработка полного набора: {e}")
return list(queryset)
categories = Category.objects.all()
processor = QueryProcessor()
res = processor.process_query(categories)
print(len(res))
Результат выполнения кода:
"Обработка полного набора: Все записи будут возвращены"
"5"
Смотрите также
-
исключение
EmptyResultSet,
которое сигнализирует о пустом результате запроса -
исключение
FieldError,
которое возникает при ошибках в полях модели -
исключение
ProgrammingError,
которое связано с ошибками программирования SQL -
исключение
ImproperlyConfigured,
которое возникает при некорректной конфигурации