Возможно ли победить рекурсивную связь в модели Django

Модель:

class ProductCategory(MPTTModel):
    """категории продуктов"""

    name = models.CharField(max_length=255)
    parent = TreeForeignKey('self', on_delete=models.CASCADE, null=True, blank=True, related_name='children')

    def __str__(self):
        return self.name

Сериализатор:

class RecursiveSerializer(serializers.Serializer):
    def to_representation(self, value):
        serializer = self.parent.parent.__class__(value, context=self.context)
        return serializer.data

class CategorySerializer(serializers.ModelSerializer):
    children = RecursiveSerializer(many=True, read_only=True)

    class Meta:
        model = ProductCategory
        fields = ('id', 'parent', 'children')

Представление:

class CategoryListAPI(viewsets.ModelViewSet):

    queryset = ProductCategory.objects.all()
    serializer_class = CategorySerializer

    @action(detail=False)
    def roots(self, request):
        queryset = ProductCategory.objects.filter(parent=None)
        serializer = self.get_serializer(queryset, many=True)
        return Response(serializer.data)

У меня 500 записей в бд, и 3 уровня вложенности. Ответ формируется более 10 сек, что очень плохо. Многое перепробовал, ничего не помогает. Наткнулся вот на такое решение https://stackoverflow.com/a/27073386/14093156 но оно не работает to_native вроде бы устарело, а с to_representation не получается никак. Буду рад любой помощи!


Ответы (0 шт):