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

一: 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 

 

五:序列化小结

 

 

posted @ 2019-03-26 22:08  pyjar  阅读(822)  评论(0编辑  收藏  举报