博客五部曲之三 - 博客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()

效果如下: