Выбор ответа Senior Django REST Framework обновлено

Медленная сериализация больших списков

Вопрос

Эндпоинт отдаёт 5000 объектов, запросов к БД всего 2, но ответ формируется секунду. Где искать и что сделать?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: Время уходит на сериализацию каждого объекта; для выгрузок values() и пагинация. При малом числе запросов время уходит в Python: DRF для каждого объекта проходит все поля, вызывает torepresentation, валидаторы представления и SerializerMethodField.

Варианты ответа

  1. Добавить ещё select_related и prefetch_related: два запроса значит, что JOIN не хватает
  2. Время уходит на сериализацию каждого объекта; для выгрузок values() и пагинацияправильный ответ
  3. Увеличить CONN_MAX_AGE, чтобы не тратить время на открытие соединения к базе
  4. Перейти на fields = "__all__", тогда DRF пропускает построение полей по одному

Разбор

При малом числе запросов время уходит в Python: DRF для каждого объекта проходит все поля, вызывает to_representation, валидаторы представления и SerializerMethodField. На тысячах объектов это заметно. Решения: пагинация, values() или values_list() с ручным построением словарей для тяжёлых выгрузок, отказ от лишних полей и методов-полей, иногда более быстрые сериализаторы (например, на Pydantic или msgspec). Дополнительные JOIN и соединения с БД здесь не помогут.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.