Как работать с вложенными комментариями запросов?
Я новичок в 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']