@vadiculus

Как оптимизировать сериалайзер mptt модели?

Мучаюсь уже пару дней. У меня есть модель комментария.

class Comment(mptt_models.MPTTModel):
    content = models.TextField(verbose_name="Контент")
    post = models.ForeignKey(Post, on_delete=models.CASCADE, related_name='comments', verbose_name="Пост")
    parent = mptt_models.TreeForeignKey('self', null=True, blank=True, on_delete=models.CASCADE, related_name='replies',
                                verbose_name="Комментарий")
    author = models.ForeignKey(User, on_delete=models.PROTECT, verbose_name="Автор")
    created = models.DateTimeField(auto_now_add=True, editable=False)

    class Meta:
        verbose_name = 'Комментарий'
        verbose_name_plural = 'Комментарии'
        ordering = ['-created']


Ну у неё естественно есть свои дети.

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

class FilterCommentListSerializer(serializers.ListSerializer):
    def to_representation(self, data):
        data = data.filter(parent=None)
        return super().to_representation(data)

class CommentsSerializer(serializers.ModelSerializer):
    author = UserSerializer(read_only=True)
    replies = RecursiveSerializer(many=True)

    class Meta:
        list_serializer_class = FilterCommentListSerializer
        model = Comment
        fields = ('id','parent','content','author', 'replies', 'created')


views:

class CommentsViewSet(ModelViewSet):
    queryset = Comment.objects.prefetch_related('replies')
    serializer_class = CommentsSerializer


В итоге silk выводит у меня вот столько запросов на 5 комментариев:

64286746b7ba8667847520.png
  • Вопрос задан
  • 116 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы