При попытке сериализации дочерних и родительских узлов модели, я получаю RecursionError - PullRequest
0 голосов
/ 28 июня 2018

Я пытаюсь создать модель комментария, которая поддерживает произвольное количество ответов. Я использую 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):

Вопрос в том, как мне избавиться от этой ошибки?

Редактировать: Я забыл сказать, что когда я пытаюсь содержать только дочерние или родительские поля и комментирую другое, это работает. Но когда я пробую их обоих вместе, это не сработает.

...