Django Комментарий Rest Framework к сообщению api - PullRequest
0 голосов
/ 09 июля 2020

Я разрабатываю api для отдыха с помощью drf, и я пытаюсь показать комментарии к api деталей сообщения. Я посмотрел вложенные сериализаторы и не смог реализовать свой проект. Как я могу использовать вложенные сериализаторы для отображения комментариев? и я получил эту ошибку:

NameError: name 'CommentSerializer' is not defined

вот мой код:

модель комментария

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)
    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

модель сообщения

class Post(models.Model):
    author = models.ForeignKey(get_user_model(), on_delete=models.CASCADE)
    image = models.ImageField(upload_to=upload_location,blank=True, null=True)
    title = models.TextField(max_length=30, null=True, blank=True)
    slug = models.SlugField(unique=True, blank=True)
    created_at = models.DateTimeField(default=timezone.now)
    star_rate = models.FloatField(default=0.0)

    def __str__(self):
        return self.slug

    def get_absolute_url(self):
        return reverse('post-detail', kwargs={'slug':self.slug})

-serializers.py

class PostDetailSerializer(serializers.ModelSerializer):
    image = SerializerMethodField()
    author = SerializerMethodField()
    comments = CommentSerializer(source='comments.content')
    class Meta:
        model = Post
        fields = ('author', 'image', 'title', 'created_at','star_rate', 'slug', 'comments')

    def get_image(self, obj):
        try:
            image = obj.image.url
        except:
            image = None
        return image

    def get_author(self, obj):
        return obj.author.username

class CommentSerializer(serializers.ModelSerializer):
    reply_count = SerializerMethodField()
    author = SerializerMethodField()
    class Meta:
        model = Comment
        fields = ('content', 'parent', 'author', 'reply_count', 'post')

    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

1 Ответ

1 голос
/ 09 июля 2020

Ваш код перевернут. Ссылки на объекты необходимо определить, прежде чем на них можно будет ссылаться. Поместите класс CommentSerializer перед классом PostDetailSerializer.

class CommentSerializer(serializers.ModelSerializer):
    reply_count = SerializerMethodField()
    author = SerializerMethodField()
    class Meta:
        model = Comment
        fields = ('content', 'parent', 'author', 'reply_count', 'post')

    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

class PostDetailSerializer(serializers.ModelSerializer):
    image = SerializerMethodField()
    author = SerializerMethodField()
    comments = CommentSerializer(source='comments.content')
    class Meta:
        model = Post
        fields = ('author', 'image', 'title', 'created_at','star_rate', 'slug', 'comments')

    def get_image(self, obj):
        try:
            image = obj.image.url
        except:
            image = None
        return image

    def get_author(self, obj):
        return obj.author.username
...