码迷,mamicode.com
首页 > 其他好文 > 详细

DRF序列化和反序列化(二:ModelSerializer)

时间:2019-03-26 22:52:11      阅读:497      评论:0      收藏:0      [点我收藏+]

标签:rom   title   meta   read   图片   mamicode   .com   添加   序列化   

一: rest_framework 中 serializers.Serializer的不方便之处(以下简称Serializer)

   a:需要定义每一个字段,并且这个字段是和models字段及其类似。

   b:和froms是不是很像,有没有类似ModelFroms类似的模块,简化字段的编写,当然有ModelSerializer就是这中类型

二:ModelSerializer序列化

    a:view中的文件不需要修改

    b:重新编写BookSerializers继承serializers.ModelSerializer

      --model 指定哪一个model

      --fields 表示需要序列化的字段,"__all__"全部字段

      --depth 向下查找一层。指对外键关系会继续遍历外键对象的全部属性。(但是如果外键表字段过多,而前端需要的字段并不是很多,使用起来会不方便。所以常常不用)

class  BookSerializers(serializers.ModelSerializer):
    class  Meta:
        model = Book

        # fields=[‘title‘,‘category‘,‘publisher‘,‘authon‘]   #可以对字段进行排序
        fields="__all__"                                     #所有的字段,但是无序
        depth=1     #向下查找一层

   c:对部分字段,如外键,choices字段,进行自定义序列化

     --需要结合反序列化一起使用

class  BookSerializers(serializers.ModelSerializer):
    #部分字段自定义  字段定义后 fields字段一定要展现
    category_display = serializers.CharField(source="get_category_display",read_only=True)

    ##处理一对多关系  调用SerializerMethodField()方法
    publisher_id = serializers.SerializerMethodField(read_only=True)
    def get_publisher_id(self,obj):
        publisher_obj =obj.publisher
        return {"id":publisher_obj.id,"title":publisher_obj.title}
    #处理多对多
    authons = serializers.SerializerMethodField(read_only=True)
    def get_authons(self,obj):
        authon_query_list=obj.authon.all()
        return [{"id":authon_query.id,"name":authon_query.name}for authon_query in authon_query_list]

    class  Meta:
        model = Book

        # fields=[‘title‘,‘category‘,‘publisher‘,‘authon‘]   #可以对字段进行排序
        fields="__all__"                                     #所有的字段,但是无序

        #depth=1     #向下查找一层
        

三:ModelSerializer反序列化

      --extra_kwargs字段设置对应的字段反序列化

      --提交的数据,和models字段一样。外键关系传递id即可

      --会自动添加数据

 class  Meta:
        model = Book

        # fields=[‘title‘,‘category‘,‘publisher‘,‘authon‘]   #可以对字段进行排序
        fields="__all__"                                     #所有的字段,但是无序

        #设置反序列化的字段  write_only
        extra_kwargs={
            ‘category‘:{‘write_only‘:True},
            ‘publisher‘: {‘write_only‘:True},
            ‘authon‘: {‘write_only‘:True},
        }

四:路由分发注意点

         a:path(‘retrieve/<int:pk>‘,views.BookEditView.as_view())       #id修改成pk 

 

五:序列化小结

技术图片

 

 

DRF序列化和反序列化(二:ModelSerializer)

标签:rom   title   meta   read   图片   mamicode   .com   添加   序列化   

原文地址:https://www.cnblogs.com/yingjp/p/10604201.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!