Django Rest Framework对post-api的评论



我正在使用drf开发rest api,并试图显示对post-detail 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

您的代码颠倒了。需要先定义被引用的实体,然后才能对其进行引用。将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

最新更新