Как работать с вложенными комментариями запросов?

Я новичок в django. Пытаюсь разобраться с запросами на вложенные комментарии. Есть проект блога с добавлением статей и добавлением комментариев к статьям. Для каждого комментария можно рекурсивно добавить комментарий и т.д.

├── blog_api
│   ├── asgi.py
│   ├── __init__.py
│   ├── settings.py
│   ├── urls.py
│   └── wsgi.py
├──── blog_api/api
|    ├── admin.py
|    ├── apps.py
|    ├── __init__.py
|    ├── migrations
|    │   └── __init__.py
|    ├── models.py
|    ├── permissions.py
|    ├── serializers.py
|    ├── tests.py
|    ├── urls.py
|    └── views.py
└── manage.py

Я описал следующие модели

api/models.py

from django.db import models

class Article(models.Model):
    date_pub = models.DateTimeField(auto_now_add=True)
    title = models.CharField (max_length = 60,  blank=True, default='')
    text = models.TextField(blank=True, default='')
    owner = models.ForeignKey('auth.User', related_name='posts', on_delete=models.CASCADE)

    class Meta:
        ordering = ['date_pub']


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']

api/serializers.py

from rest_framework import serializers
from api.models import Article
from api.models import Comment

from django.contrib.auth.models import User

class ArticleSerializer(serializers.ModelSerializer):
    owner = serializers.ReadOnlyField(source='owner.username')
    comments = serializers.PrimaryKeyRelatedField(many=True, read_only=True)

    class Meta:
        model = Article
        fields = ['id', 'title', 'text', 'owner', 'comments']


class UserSerializer(serializers.ModelSerializer):
    posts = serializers.PrimaryKeyRelatedField(many=True, read_only=True)
    comments = serializers.PrimaryKeyRelatedField(many=True, read_only=True)

    class Meta:
        model = User
        fields = ['id', 'username', 'posts', 'comments']


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']

Запрос GET возвращает следующую структуру комментария:

У меня нет идей для решения следующих проблем:

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

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

Как можно воссоздать древовидную структуру из ответа API комментариев?

Вы можете проверить, работает ли этот код у вас?

class FinalLevelRepliesSerializer(serializers.ModelSerializer):
    owner = serializers.ReadOnlyField(source='owner.username')

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

class FirstLevelRepliesSerializer(serializers.ModelSerializer):
    owner = serializers.ReadOnlyField(source='owner.username')
    reply_set = FinalLevelRepliesSerializer(many=True, read_only=True)
    class Meta:
        model = Comment
        fields = ['id', 'text', 'owner', 'article', 'parent', 'reply_set']

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

    class Meta:
        model = Comment
        fields = ['id', 'text', 'owner', 'article', 'parent', 'reply_set']
Вернуться на верх