Что делать, когда есть API на Django REST с выводом объектов, когда количество запросов при сериализации зависимых объектов увеличивается в геометрической прогрессии.
В таких случаях на спасет только select_related или prefetch_related для queryset.
Для этого в классе ModelSerializer создаем дополнительный статичный метод.
class Serializer(serializers.ModelSerializer):
contractor = ContractorSerializer()
internal = InternalSerializer()
document_type = DocumentSerializer()
@staticmethod
def setup_eager_loading(queryset):
# "one: relationships
queryset = queryset.select_related('contractor', 'internal', 'internal__head_user', )
# "to-many" relationships
queryset = queryset.prefetch_related('document_type', )
return queryset
А в классе ViewSet переопределяем метод get_queryset
class ViewSet(BaseViewSets, viewsets.ModelViewSet):
def get_queryset(self):
queryset = Document.objects.all()
queryset = Document.get_serializer_class().setup_eager_loading(queryset)
return queryset
И таким нехитрым способом, мы можем сильно снизить количество запросов.
Спасибо за внимание :)