Как убрать дублирование вложенных комментариев Django REST?
Модель:
class Article(models.Model):
id = models.AutoField(primary_key=True)
slug = models.SlugField()
publications_date = models.DateTimeField(blank=True, null=True, default=datetime.datetime.now)
tag = models.CharField(max_length=100, blank=True, null=True)
title = models.CharField(max_length=100, blank=True, null=True)
content_preview = models.TextField(blank=True)
body = HTMLField(blank=True, null=True)
image_preview = models.ImageField(upload_to=upload_to, blank=True)
image_preview_name = models.CharField(max_length=100, blank=True, null=True)
def __str__(self):
return self.title
@property
def comments_list(self):
return self.comments.filter()
class Comment(models.Model):
id = models.CharField(max_length=100, blank=True, unique=True, default=uuid.uuid4, primary_key=True)
date = models.DateTimeField(auto_now=True, auto_now_add=False)
name = models.CharField(max_length=100)
body = models.TextField(blank=True, null=True)
post = models.ForeignKey(Article, on_delete=models.CASCADE, blank=True,
related_name='comments', related_query_name='comment')
parent = models.ForeignKey('self', related_name='reply', null=True, blank=True, on_delete=models.PROTECT)
def __str__(self):
return f'Post - "{self.post.title}", Body - "{self.body}"'
Serializer:
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):
"""DRF Serializer For Listing Published Comment"""
reply = RecursiveSerializer(many=True, read_only=True)
class Meta:
model = Comment
fields = [
'name',
'body',
'date',
'id',
'parent',
'reply'
]
class ArticleSerializer(serializers.ModelSerializer):
comments = CommentSerializer(many=True)
class Meta:
model = Article
lookup_field = 'slug'
fields = (
'id',
'slug',
'publications_date',
'tag',
'title',
'content_preview',
'body',
'image_preview',
'image_preview_name',
'comments'
)
Views:
class DetailArticle(generics.RetrieveUpdateDestroyAPIView):
queryset = Article.objects.all()
serializer_class = ArticleSerializer
lookup_field = 'slug'
В JSON дублируются комментарии (третий выводится в двух местах):
{
"id": 1,
"slug": "mp3kit",
"publications_date": "2019-03-19T13:49:58Z",
"tag": "Тэг",
"title": "Название",
"content_preview": "Превью",
"body": "Body",
"image_preview": null,
"image_preview_name": "mp3kit",
"comments": [
{
"name": "Первый комментарий",
"body": "Первый комментарий",
"date": "2019-06-02T15:09:16.788405Z",
"id": "57fd0069-a8ce-484f-afac-4cc609a1b70c",
"parent": null,
"reply": [
{
"name": "Третий комментарий",
"body": "Третий комментарий",
"date": "2019-06-02T15:09:42.512872Z",
"id": "0801ef96-796d-477b-8631-b21559527156",
"parent": "57fd0069-a8ce-484f-afac-4cc609a1b70c",
"reply": []
}
]
},
{
"name": "Второй комментарий",
"body": "Второй комментарий",
"date": "2019-06-02T15:09:27.209497Z",
"id": "5b2f0d25-bcd0-4b19-b05c-e6a5e7de1280",
"parent": null,
"reply": []
},
{
"name": "Третий комментарий",
"body": "Третий комментарий",
"date": "2019-06-02T15:09:42.512872Z",
"id": "0801ef96-796d-477b-8631-b21559527156",
"parent": "57fd0069-a8ce-484f-afac-4cc609a1b70c",
"reply": []
}
]
}
Как избавится от этого эффекта? Как я понимаю нужно поставить фильтр на поле comment в ArticleSerializer, чтобы запретить вывод комментариев с parent?