Нет серебряной пули, если не смотреть детально на код (и результаты профилирования).
Единственное, что не составляет никакого труда, - это навязывание отношений в моделях и в базе данных.Это предотвращает целый ряд ошибок, поощряет использование стандартизированного, производительного доступа (вместо того, чтобы сочинять SQL на месте, который чаще всего будет содержать ошибки и медленно), и делает ваш код и короче, игораздо более удобочитаемым.
Кроме этого, 50-60 запросов может быть много (если вы могли бы сделать ту же работу с одним или двумя), или это может быть просто правильно - это зависит от того, чего вы достигнете сих.
Использование prefetch_related
и select_related
важно, да - но только при правильном использовании;в противном случае это может замедлить вас, а не ускорить.
Вложенные сериализаторы - правильный подход, если вам нужны данные, но вам нужно правильно настроить наборы запросов в наборе представлений, если вы хотите, чтобы они были быстрыми.
Время основных частей медленных представлений, проверить отправленные запросы SQL и проверить, действительно ли вам нужны все возвращаемые данные.
Затем вы можете посмотреть на больные места и получить время, когда оновопросы.Задавая конкретные вопросы о SO с помощью полных примеров кода, вы также сможете быстро справиться.
Если у вас есть только один объект верхнего уровня, вы можете усовершенствовать подход, предлагаемый @jensmtg, выполнив все предварительные выборки, которыевам нужно на этом уровне, а затем для более низких уровней просто использовать ModelSerializer
с (не SerializerMethodField
с), которые получают доступ к предварительно выбранным объектам.Посмотрите на объект Prefetch , который допускает вложенную предварительную выборку.
Но имейте в виду, что prefetch_related
не бесплатна, она требует некоторой обработки в Python;вам может быть лучше использовать плоские (как в db-view) соединенные запросы с values()
и values_list
.