zoukankan      html  css  js  c++  java
  • 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 

    五:序列化小结

     

     

  • 相关阅读:
    Graylog安装操作
    CF1012C Hills
    MySQL 加锁处理分析
    2.22考试
    int(1)和int(11)是否有区别?
    「LibreOJ NOI Round #1」验题
    MySQL一致性非锁定读
    [学习笔记]凸优化/WQS二分/带权二分
    MySQL latch小结
    [八省联考2018]林克卡特树lct——WQS二分
  • 原文地址:https://www.cnblogs.com/yingjp/p/10604201.html
Copyright © 2011-2022 走看看