用Django REST framework 编写RESTful
2018-01-27 本文已影响86人
Jimzjy
版本 :
- 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)
结尾
上几篇: