Вложенные комментарии Django дублирование SQL запросов

Есть приложение которое имеет два endpoint первое для создания и вывода постов (api/v1/poll/) и второе(api/v1/comment) для создания и вывода многоуровневых комментариев. При получении комментариев к посту либо просто комментариев каждый SQL запрос дублируется 4 раза, просмотрел это через django-debug-toolbar вот скрин.

Django Debug Toolbar SQL

Делал приложение на основе вот этой статьи с использованием библиотеки fluentcomments, которая в свою очередь основа на threadedcomments. Своей модели комментариев я не использовал, брал FlutterComment.

Допустим при получении поста с id=2 через get запрос по пути api/v1/poll/2/ в дебаггере видно, что я попадаю в функцию get_comments 4 раза, я не понимаю почему это происходит.

Когда я обращаюсь к api/v1/comment/1/ get запросом для получения комментария с id=1, также 4 раза дублируется один и тот же запрос

models.py

from django.db import models
class Poll(models.Model):
    name = models.CharField(max_length=255)
    details = models.TextField(blank=True, null=True)

    def __str__(self):
        return self.name

serializers.py

from fluent_comments.models import FluentComment
from rest_framework import serializers
from .models import Poll


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


class CommentSerializerWithoutChildren(serializers.ModelSerializer):
    #children = RecursiveField(many=True)

    class Meta:
        model = FluentComment
        fields = (
            'tree_path',
            'object_pk',
            'comment',
            'id',
        )


class CommentSerializerFull(serializers.ModelSerializer):
    children = RecursiveField(many=True)

    class Meta:
        model = FluentComment
        fields = (
            'tree_path',
            'object_pk',
            'comment',
            'id',
            'children'
        )


class PollSerializer(serializers.ModelSerializer):
    comments = serializers.SerializerMethodField()

    class Meta:
        model = Poll
        fields = ('id', 'name', 'details', 'comments')

    @staticmethod
    def get_comments(obj):
        poll_comment = FluentComment.objects.filter(object_pk=obj.id, tree_path__regex="^.{10}$|^.{21}$|^.{32}$")
        serializer = CommentSerializerWithoutChildren(poll_comment, many=True)
        data = serializer.data
        return data

views.py

from .models import Poll
from django.contrib.contenttypes.models import ContentType
from rest_framework.response import Response
from datetime import datetime
from Kvartirka import settings


class PollViewSet(viewsets.ModelViewSet):
    queryset = Poll.objects.all()
    serializer_class = PollSerializer

    def retrieve(self, request, pk=None):
        poll = self.get_object()
        serializer = self.serializer_class(poll, context={'request': request})
        return Response(serializer.data)


class CommentViewSet(viewsets.ModelViewSet):
    queryset = FluentComment.objects.all()
    serializer_class = CommentSerializerFull

    def create(self, request, *args, **kwargs):
        if request:
            data = self.request.data
            comment = data['comment']
            poll = data['Poll']
            if 'parent' in data:
                parent = data['parent']
            else:
                parent = None
            submit_date = datetime.now()
            content = ContentType.objects.get(model="Poll").pk
            comment = FluentComment.objects.create(object_pk=poll, comment=comment, submit_date=submit_date,
                                                   content_type_id=content, user_id=self.request.user.id,
                                                   site_id=settings.SITE_ID, parent_id=parent)
            serializer = CommentSerializerFull(comment, context={'request': request})
            return Response(serializer.data)

urls.py

from rest_framework import routers
from .views import CommentViewSet, PollViewSet

router = routers.DefaultRouter()
router.register(r'poll', PollViewSet)
router.register(r'comment', CommentViewSet)

urlpatterns = router.urls
Вернуться на верх