Я пытаюсь создать модель комментария, которая поддерживает произвольное количество ответов. Я использую Django Rest Framework и для деревьев комментариев я использую django-treebeard.
Это код моей модели:
class Comment(MP_Node):
paylasan = models.ForeignKey(
to=settings.AUTH_USER_MODEL,
on_delete=models.CASCADE)
soru = models.ForeignKey(
to=Soru,
related_name="comments",
on_delete=models.CASCADE)
metin = models.TextField()
upvote = models.PositiveIntegerField(default=0)
downvote = models.PositiveIntegerField(default=0)
created = models.DateTimeField(auto_now_add=True)
node_order_by = ['upvote']
def __unicode__(self):
return self.metin
Это мой взгляд, который прост:
class Comments(generics.ListAPIView):
queryset = Comment.objects.all()
serializer_class = CommentSerializer
Это мой сериализатор:
class CommentSerializer(serializers.ModelSerializer):
paylasan = serializers.StringRelatedField()
children = serializers.SerializerMethodField(
read_only=True, method_name="get_children_nodes"
)
parent = serializers.SerializerMethodField(
read_only=True, method_name="get_parent_nodes"
)
class Meta:
fields = (
"id",
"metin",
"soru",
"paylasan",
"children",
"parent",
"upvote",
"downvote",
"created"
)
model = Comment
def get_children_nodes(self, obj):
child_queryset = obj.get_descendants()
return CommentSerializer(child_queryset, many=True).data
def get_parent_nodes(self, obj):
try:
parent_id = obj.get_parent().id
except AttributeError:
return {}
parent_queryset = Comment.objects.filter(id=parent_id)
return CommentSerializer(parent_queryset, many=True).data
Когда я запускаю тест в оболочке ipython, я получаю сообщение об ошибке
RecursionError: maximum recursion depth exceeded while calling a Python object
, который в конечном итоге указывает на эти строки в сериализаторе:
~/Python/webapp/soruweb/serializers.py in get_children_nodes(self, obj)
82 def get_children_nodes(self, obj):
83 child_queryset = obj.get_descendants()
---> 84 return CommentSerializer(child_queryset, many=True).data
85
86 def get_parent_nodes(self, obj):
Вопрос в том, как мне избавиться от этой ошибки?
Редактировать: Я забыл сказать, что когда я пытаюсь содержать только дочерние или родительские поля и комментирую другое, это работает. Но когда я пробую их обоих вместе, это не сработает.