Медленная сериализация больших списков
Вопрос
Эндпоинт отдаёт 5000 объектов, запросов к БД всего 2, но ответ формируется секунду. Где искать и что сделать?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Варианты ответа
- Добавить ещё
select_relatedиprefetch_related: два запроса значит, что JOIN не хватает - Время уходит на сериализацию каждого объекта; для выгрузок
values()и пагинацияправильный ответ - Увеличить
CONN_MAX_AGE, чтобы не тратить время на открытие соединения к базе - Перейти на
fields = "__all__", тогда DRF пропускает построение полей по одному
Разбор
При малом числе запросов время уходит в Python: DRF для каждого объекта проходит все поля, вызывает to_representation, валидаторы представления и SerializerMethodField. На тысячах объектов это заметно. Решения: пагинация, values() или values_list() с ручным построением словарей для тяжёлых выгрузок, отказ от лишних полей и методов-полей, иногда более быстрые сериализаторы (например, на Pydantic или msgspec). Дополнительные JOIN и соединения с БД здесь не помогут.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.