Для моего проекта я начал использовать Laravel для API, а не переключился на Django / django rest framework, я сделал это для увеличения скорости, поскольку мне нужно запрашивать большие данные.
Теперь я получил следующееСитуация: у меня есть «Группа», в которой есть «Предметы» и рекурсивная связь.
Теперь в группе может быть около 2000+ предметов (включая потомков), родительский предмет имеет +/- 30 предметов..
Это мой код:
сериализаторы
class RecursiveField(serializers.Serializer):
def to_representation(self, value):
serializer = self.parent.parent.__class__(value, context=self.context)
return serializer.data
class SubjectSerializer(serializers.ModelSerializer):
parent_of = RecursiveField(many=True, read_only=True)
class Meta:
model = Subject
fields = ("id", "name", "parent_of", "parent")
class GroupSerializer(serializers.ModelSerializer):
subjects = SubjectSerializer(many=True, read_only=True)
class Meta:
model = Group
fields = ("id", "name", "subjects")
def setup_eager_loading(cls, queryset):
return queryset.prefetch_related("subjects")
просмотров
class GroupViewSet(ModelViewSet):
class Paginator(BasePaginator):
model = Group
queryset = Group.objects.all()
serializer_class = serializers.GroupSerializer
pagination_class = Paginator
def get_queryset(self):
return self.get_serializer().setup_eager_loading(GroupViewSet.queryset)
Я протестировал тот же запрос с API-интерфейсом Laravel и он намного быстрее, все еще заметно медленный, но все в порядке (5-10 секунд).С каркасом отдыха django он слишком медленный (1 минута +/-), и это всего лишь страница с 1 группой из 2500 предметов.
Я знаю, что занимает много времени, класс RecursiveField, потому что, когда я удаляю этозапрос выполняется менее чем за 2 секунды.Итак, мой вопрос в чем основная причина, потому что это создает рекурсивное отношение (я сомневаюсь)?Или это потому, что я не получаю предварительную выборку?
И, конечно, какой лучший способ сделать это?
Спасибо