版本 :
- Django==2.0.1
- djangorestframework==3.7.7
- Github地址
上幾篇:
- 用Django REST framework 編寫RESTful API(1.構(gòu)建基礎(chǔ)API)
- 用Django REST framework 編寫RESTful API(2.對(duì)viewsets和modelseriaizer自定義)
添加評(píng)論 model
評(píng)論的組成:
- 評(píng)論者
- 評(píng)論時(shí)間
- 內(nèi)容主體
一條評(píng)論需要由上面三個(gè)部分組成, 所以新建 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',)
我們現(xiàn)在已經(jīng)有了一個(gè)基本的評(píng)論 model , 但是還不夠, 我們還沒有處理評(píng)論于文章的關(guān)系, 以及評(píng)論與評(píng)論的關(guān)系
一條評(píng)論可以是評(píng)論文章的, 也可以是對(duì)已有評(píng)論的回復(fù)
所以添加 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: 用來(lái)指出評(píng)論與文章的關(guān)系, 說(shuō)明這條評(píng)論是屬于哪篇文章的
reply_comment: 用來(lái)指出評(píng)論與回復(fù)的關(guān)系,說(shuō)明這條評(píng)論(回復(fù))是屬于哪條評(píng)論的, 因?yàn)椴灰欢織l評(píng)論都會(huì)有回復(fù), 所以設(shè)置 blank=True, null=True
replies: 屬于此條評(píng)論的回復(fù)
添加評(píng)論的 Serializer
class ReplyCommentSerializer(serializers.HyperlinkedModelSerializer):
"""
Comment序列化器, 用于序列化 被回復(fù)者 的信息
"""
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 用于序列化 被回復(fù)者 的信息, 對(duì)于被回復(fù)者, 只需要得到部分信息就可以, 像 'url', 'id', 'user'
CommentSeriaizer 序列化所有信息
在 GET /api/posts/ 時(shí), 對(duì)于 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', 可以用來(lái)判斷這條評(píng)論是否存在回復(fù)
在 PostSerializer 中添加:
comments = CommentSerializerLite(many=True, read_only=True)
修改 fields :
fields = ('url', 'id', 'title', 'pub_time', 'author', 'body', 'tags', 'comments')
注冊(cè) router
router.register(r'comments', CommentViewSet)
結(jié)尾
上幾篇: