Исключение FullResultSet

Исключение FullResultSet относится к подсистеме работы с QuerySet и используется внутри механизмов оптимизации запросов Django. Оно наследуется от EmptyResultSet и сигнализирует о том, что результат запроса должен содержать все записи, а не пустое множество. Это исключение обычно возбуждается в ситуациях, когда условия фильтрации таковы, что они не ограничивают выборку, и базе данных необходимо вернуть полный набор данных.

Синтаксис

pythonfrom django.core.exceptions import EmptyResultSet

class FullResultSet(EmptyResultSet):
  pass

Исключение FullResultSet не требует специального импорта из отдельного модуля - оно доступно через django.core.exceptions. В большинстве случаев разработчики не возбуждают это исключение вручную, а обрабатывают его при необходимости.

Пример . Использование в оптимизации запросов

Рассмотрим ситуацию, когда метод values_list с флагом flat может возбудить исключение FullResultSet:

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

try:
  titles = Article.objects.values_list('title', flat=True)
  # Здесь может быть оптимизация, которая возбуждает FullResultSet
except FullResultSet:
  print("FullResultSet: Запрос вернет все записи")

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

python"FullResultSet: Запрос вернет все записи"

Пример . Обработка исключения

Продемонстрируем обработку исключения FullResultSet в пользовательском коде при работе с оптимизированными запросами:

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

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

python["Full result set detected"]

Обратите внимание, что в реальных проектах FullResultSet редко используется напрямую - обычно это внутреннее исключение для оптимизации запросов.

Пример . В пользовательском коде

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

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

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

python"Обработка полного набора: Все записи будут возвращены"
"5"

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

  • исключение EmptyResultSet,
    которое сигнализирует о пустом результате запроса
  • исключение FieldError,
    которое возникает при ошибках в полях модели
  • исключение ProgrammingError,
    которое связано с ошибками программирования SQL
  • исключение ImproperlyConfigured,
    которое возникает при некорректной конфигурации