django остальная система комментариев фреймворка - PullRequest
1 голос
/ 13 июля 2020

Я пытаюсь создать 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

1 Ответ

0 голосов
/ 13 июля 2020

Как выглядит ваш вид? Если вы хотите, чтобы в качестве комментариев верхнего уровня отображались только комментарии без родительского элемента, вам необходимо убедиться, что набор запросов, заполняющий ваш сериализатор, правильно фильтрует, например Comment.objects.filter(parent__isnull=True)

...