Мучаюсь уже пару дней. У меня есть модель комментария.
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 комментариев: