Я пытаюсь создать api для отдыха с django, и у меня проблемы с системой комментариев. В API мои комментарии отображаются правильно, но ответы на комментарии отображаются дважды. Один в поле комментариев сообщения, другой в поле комментариев для ответов. Как и в глубине 1 и 2. Вкратце, вот мой код:
- serializers.py
class CommentChildSerializer(serializers.ModelSerializer):
parent_id = serializers.PrimaryKeyRelatedField(queryset=Comment.objects.all(),source='parent.id')
author = SerializerMethodField()
class Meta:
model = Comment
fields = ('author', 'content', 'id','parent_id')
def get_author(self, obj):
return obj.author.username
def create(self, validated_data):
subject = parent.objects.create(parent=validated_data['parent']['id'], content=validated_data['content'])
class CommentSerializer(serializers.ModelSerializer):
reply_count = SerializerMethodField()
author = SerializerMethodField()
replies = SerializerMethodField()
class Meta:
model = Comment
fields = ('id','content', 'parent', 'author', 'reply_count', 'replies')
# depth = 1
def get_reply_count(self, obj):
if obj.is_parent:
return obj.children().count()
return 0
def get_author(self, obj):
return obj.author.username
def get_replies(self, obj):
if obj.is_parent:
return CommentChildSerializer(obj.children(), many=True).data
return None
class PostListSerializer(serializers.ModelSerializer):
url = post_detail_url
author = SerializerMethodField()
image = SerializerMethodField()
comments = CommentSerializer(required=False, many=True)
# comments = SerializerMethodField()
class Meta:
model = Post
fields = ('title', 'image', 'author', 'star_rate', 'url', 'slug', 'comments')
def get_author(self, obj):
return obj.author.username
def get_image(self, obj):
try:
image = obj.image.url
except:
image = None
return image
- комментарий модель
class Comment(models.Model):
post = models.ForeignKey(Post, on_delete=models.CASCADE, related_name='comments')
author = models.ForeignKey(CustomUser, on_delete=models.CASCADE)
content = models.TextField(max_length=255)
created_at = models.DateTimeField(auto_now_add=True)
parent = models.ForeignKey('self', null=True, blank=True, on_delete=models.CASCADE, related_name='replies')
is_active = models.BooleanField(default=True)
class Meta:
ordering = ('created_at',)
def __str__(self):
return f'Comment by {self.author.username} on {self.post}'
def children(self):
return Comment.objects.filter(parent=self)
@property
def is_parent(self):
if self.parent is not None:
return False
return True