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