Какой запрос API следует отправить для получения параметров графика?

У меня есть блог на django. У меня есть две модели статья и комментарий. Каждый комментарий может быть добавлен к другому. Если я отправляю API запрос localhost:8000/comments/1, я получаю комментарий с id="1" и все вложенные комментарии до третьего уровня.

json после api запроса localhost:8000/comments/ :

HTTP 200 OK
Allow: GET, POST, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept

[
    {
        "id": 9,
        "text": "First comment",
        "owner": "alex",
        "article": 3,
        "parent": null,
        "reply_set": [
            {
                "id": 10,
                "text": "Comment to comment",
                "owner": "alex",
                "article": 3,
                "parent": 9,
                "reply_set": [
                    {
                        "id": 11,
                        "text": "Third level nested comment",
                        "owner": "alex",
                        "article": 3,
                        "parent": 10
                    }
                ]
            }
        ]
    },
    {
        "id": 10,
        "text": "Comment to comment",
        "owner": "alex",
        "article": 3,
        "parent": 9,
        "reply_set": [
            {
                "id": 11,
                "text": "Third level nested comment",
                "owner": "alex",
                "article": 3,
                "parent": 10,
                "reply_set": [
                    {
                        "id": 12,
                        "text": "Forth level nested comment",
                        "owner": "alex",
                        "article": 3,
                        "parent": 11
                    }
                ]
            }
        ]
    },
    {
        "id": 11,
        "text": "Third level nested comment",
        "owner": "alex",
        "article": 3,
        "parent": 10,
        "reply_set": [
            {
                "id": 12,
                "text": "Forth level nested comment",
                "owner": "alex",
                "article": 3,
                "parent": 11,
                "reply_set": []
            }
        ]
    },
    {
        "id": 12,
        "text": "Forth level nested comment",
        "owner": "alex",
        "article": 3,
        "parent": 11,
        "reply_set": []
    }
]

Как получить комментарий третьего уровня со всеми остальными вложенными комментариями? Что нужно писать в представлениях и урлах?

Комментарий модели:

class Comment(models.Model):
    date_pub = models.DateTimeField(auto_now_add=True)
    text = models.TextField(blank=False)
    owner = models.ForeignKey('auth.User', related_name='comments', on_delete=models.CASCADE)
    article = models.ForeignKey('Article', related_name='comments', on_delete=models.CASCADE)
    parent = models.ForeignKey('self', related_name='reply_set', null=True, on_delete=models.PROTECT)

    class Meta:
        ordering = ['date_pub']

Сериализатор комментариев:

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


class CommentSerializer(serializers.ModelSerializer):
    owner = serializers.ReadOnlyField(source='owner.username')
    reply_set = RecursiveSerializer(many=True, read_only=True)

    class Meta:
        model = Comment
        fields = ['id', 'text', 'owner', 'article', 'parent', 'reply_set']

Просмотры комментариев

class CommentList(generics.ListCreateAPIView):
    queryset = Comment.objects.all()
    serializer_class = serializers.CommentSerializer
    permission_classes = [permissions.IsAuthenticatedOrReadOnly]

    def perform_create(self, serializer):
        serializer.save(owner=self.request.user)

class CommentDetail(generics.RetrieveUpdateDestroyAPIView):
    queryset = Comment.objects.all()
    serializer_class = serializers.CommentSerializer
    permission_classes = [permissions.IsAuthenticatedOrReadOnly,
                          IsOwnerOrReadOnly]

В urlpatterns:

path('comments/', views.CommentList.as_view()), path('comments/int:pk/', views.CommentDetail.as_view())

>

если ваш вопрос заключается в том, как вы можете получить все комментарии третьего уровня (без их родителей, только комментарии третьего уровня) определенного комментария первого уровня, тогда вы можете отфильтровать набор запросов следующим образом

third_level_comment = Comment.objects.filter(replay_set__replay_set__id = <the 1st level comment id>)

вы используете двойную оценку "__", чтобы подняться на уровень выше по цепочке отношений

Вернуться на верх