Django Rest Framework Вложенные комментарии
Я пытаюсь создать бэкенд для сайта блога. Я создал модель комментариев и связал ее с записью в блоге. Когда я вывожу список комментариев, я также могу перечислить ответы, которые были сделаны на комментарий. Но есть проблема в том, что даже если комментарий отображается как ответ, он также выглядит так, как будто это снова был основной комментарий. Как я могу решить эту проблему. Я буду благодарен, если кто-то сможет помочь. У меня могут быть ошибки в английском, надеюсь, я смог рассказать вам то, что хотел. Заранее спасибо.
Комментарий модели:
class Comments(models.Model):
class Meta:
verbose_name = 'Yorum'
verbose_name_plural = 'Yorumlar'
user = models.ForeignKey(User, verbose_name='Yorum sahibi', on_delete=models.CASCADE)
post = models.ForeignKey(Post, verbose_name='Yorum yapılacak Post', on_delete=models.CASCADE,related_name='comments')
parent_id = models.ForeignKey('self', verbose_name='Parent Yorum', related_name='subcomments',on_delete=models.CASCADE, null=True, blank=True)
comment = models.TextField(verbose_name='Yorum')
[enter image description here][1]created_at = models.DateTimeField(auto_now_add=True, blank=True)
updated_at = models.DateTimeField(auto_now=True, blank=True)
def __str__(self):
return self.user.first_name + " " + self.user.last_name + " | " + self.post.title
Сериализатор комментариев:
class CommentSerializer(serializers.ModelSerializer):
class Meta:
model = Comments
fields = '__all__'
def get_fields(self):
fields = super(CommentSerializer, self).get_fields()
fields['subcomments'] = CommentSerializer(many=True, read_only=True)
return fields
Post Serializer
class PostSerializer(serializers.ModelSerializer):
tag = serializers.StringRelatedField(many=True, read_only=True)
comments = CommentSerializer(many=True, read_only=True)
author = AuthorSerializer(read_only=True)
category = CategorySerializer2(read_only=True)
class Meta:
model = Post
fields = '__all__'
Первый вариант
Для решения проблемы можно использовать вложенный сериализатор
class CommentSerializer(serializers.ModelSerializer):
parent_id = serializers.PrimaryKeyRelatedField()
class Meta:
model = Comment
fields = '__all__'
def get_related_field(self, model_field):
return CommentSerializer()
Второй вариант
Вы можете использовать библиотеку под названием djangorestframework-recursive для вашего случая использования
Сначала установите библиотеку
pip install djangorestframework-recursive
В вашем файле сериализатора
from rest_framework import serializers
from rest_framework_recursive.fields import RecursiveField
class CommentSerializer(serializers.ModelSerializer):
parent_id = serializers.ListField(child=RecursiveField())
class Meta:
model = Comments
fields = '__all__'