DRF требуется слишком много времени для возврата вложенных сериализованных данных
У нас слишком много моделей, которые связаны между собой, При возврате набора запросов сериализация данных происходит слишком медленно (serializer.data). Ниже приведены наши модели и сериализатор.
Почему вложенный сериализатор django слишком долго возвращает ответ JSON. Что мы делаем неправильно?
models.py
views.py
class DoctorBySpecialityView(APIView):
permission_classes = [IsAuthenticated]
def get(self, request, *args, **kwargs):
doctor = request.user
specialties = Specialties.objects
active_doctor = get_all_active_doctors().count()
search = request.query_params.get(constants.SEARCH, None)
context = {"me": doctor, "search": search}
serialized_specialties = SpecialitiesWithListOfDoctors(
specialties, many=True, context=context
)
data = {
"specialties": serialized_specialties.data,
"active_doctor": active_doctor,
}
response = get_response(
status=status.HTTP_200_OK,
status_code=ResponseStatus.success.value,
data=data,
)
return Response(response, status=status.HTTP_200_OK)
serializers.py
Примечание: Это один из примеров. У нас слишком много подобных примеров. В этом примере я хочу получить все специальности со списком врачей, а врач сам по себе содержит свои достижения, место работы и многие другие модели
Обычно время сериализации не является проблемой для вложенных сериализаторов, но количество выполняемых запросов является проблемой.
Вам необходимо передавать оптимизированный набор запросов вашему сериализатору, используя select_related
и prefetch_related
, когда это возможно.
Начните с просмотра количества запросов, выполняемых для каждого запроса, я рекомендую Django Debug Toolbar