用Django REST framework 编写RESTful API(3.添加评论模块)

版本 :

  • Django==2.0.1
  • djangorestframework==3.7.7
  • Github地址

上几篇:

  • 用Django REST framework 编写RESTful API(1.构建基础API)
  • 用Django REST framework 编写RESTful API(2.对viewsets和modelseriaizer自定义)

添加评论 model

评论的组成:

  • 评论者
  • 评论时间
  • 内容主体

一条评论需要由上面三个部分组成, 所以新建 model :

class Comment(models.Model):
    user = models.ForeignKey('auth.User', related_name='comments', on_delete=models.CASCADE)
    pub_time = models.DateTimeField(auto_now_add=True)
    body = models.CharField(max_length=300)

    class Meta:
        ordering = ('-pub_time',)

我们现在已经有了一个基本的评论 model , 但是还不够, 我们还没有处理评论于文章的关系, 以及评论与评论的关系
一条评论可以是评论文章的, 也可以是对已有评论的回复
所以添加 Field :

in_post = models.ForeignKey(Post, related_name='comments', on_delete=models.CASCADE)
reply_comment = models.ForeignKey('self', related_name='replies', on_delete=models.CASCADE, blank=True, null=True)

in_post: 用来指出评论与文章的关系, 说明这条评论是属于哪篇文章的
reply_comment: 用来指出评论与回复的关系,说明这条评论(回复)是属于哪条评论的, 因为不一定每条评论都会有回复, 所以设置 blank=True, null=True
replies: 属于此条评论的回复

添加评论的 Serializer

class ReplyCommentSerializer(serializers.HyperlinkedModelSerializer):
    """
    Comment序列化器, 用于序列化 被回复者 的信息
    """
    user = UserSerializerLite(read_only=True)

    class Meta:
        model = Comment
        fields = ('url', 'id', 'user')


class CommentSerializer(serializers.HyperlinkedModelSerializer):
    """
    Comment序列化器
    """
    reply_comment = ReplyCommentSerializer(read_only=True)

    class Meta:
        model = Comment
        fields = ('url', 'id', 'pub_time', 'body', 'reply_comment', 'in_post', 'replies')

ReplyCommeSerializer 用于序列化 被回复者 的信息, 对于被回复者, 只需要得到部分信息就可以, 像 'url', 'id', 'user'
CommentSeriaizer 序列化所有信息

在 GET /api/posts/ 时, 对于 comment 不需要完整的信息, 所以新建:

class CommentSerializerLite(serializers.HyperlinkedModelSerializer):
    """
    只包含 'url', 'id', 'pub_time', 'body', 'reply_comment' 的Comment序列化器
    """
    reply_comment = ReplyCommentSerializer(read_only=True)

    class Meta:
        model = Comment
        fields = ('url', 'id', 'pub_time', 'body', 'reply_comment')

删除了 'in_post' 'replies' ,但是保留 'reply_commen', 可以用来判断这条评论是否存在回复

在 PostSerializer 中添加:

comments = CommentSerializerLite(many=True, read_only=True)

修改 fields :

fields = ('url', 'id', 'title', 'pub_time', 'author', 'body', 'tags', 'comments')

注册 router

router.register(r'comments', CommentViewSet)

结尾

上几篇:

  • 用Django REST framework 编写RESTful API(1.构建基础API)
  • 用Django REST framework 编写RESTful API(2.对viewsets和modelseriaizer自定义)

你可能感兴趣的:(用Django REST framework 编写RESTful API(3.添加评论模块))