博客五部曲之三 - 博客RESTful
1439 浏览 5 years, 9 months
15 使用序列化方法
版权声明: 转载请注明出处 http://www.codingsoho.com/使用序列化方法
在前面的列表视图或者详情视图中,我们看到用户信息只显示用户ID,如果我们想显示用户名怎么办?可以用SerializerMethodField方法来解决。
SerializerMethodField
首先导入SerializerMethodField,将要自定义显示的字段用该方法初始化,记得在fields里面包含这个字段。
然后实现该字段的自定义显示,重写get_fieldname函数。
from rest_framework.serializers import SerializerMethodField
class PostListSerializer(serializers.ModelSerializer):
user = SerializerMethodField()
class Meta:
model = Post
fields = [
"url",
"title",
"publish",
"user",
"delete_url"
]
def get_user(self, obj):
return str(obj.user.username)
再次查看是user能够显示用户名了
{
"url": "[http://127.0.0.1](http://127.0.0.1):8000/api/posts/new-post-1/",
"title": "new post",
"publish": "2018-04-18",
"user": "bhe001",
"delete_url": "[http://127.0.0.1](http://127.0.0.1):8000/api/posts/new-post-1/delete"
},
同样的方法,我们可以自定义image和content的显示
注意,针对内容显示的时候我们增加了一个html,这个并不是model的字段,指示content的markdown转化结果
class PostDetailSerializer(serializers.ModelSerializer):
url = post_detail_url
user = SerializerMethodField()
image = SerializerMethodField()
html = SerializerMethodField()
class Meta:
model = Post
fields = [
"url",
"title",
"slug",
"publish",
"user",
"image",
"content",
"html"
]
def get_user(self, obj):
return str(obj.user.username)
def get_image(self, obj):
if obj.image and obj.image.url:
return obj.image.url
return None
def get_html(self, obj):
return obj.get_markdown()
效果如下: