zoukankan      html  css  js  c++  java
  • Django-rest Framework(四)

    序列化模块时rest-framework的很重要的组成部分

    rest-framework序列化模块(核心)

    一. 为什么要使用序列化组件?

    后台的数据多以后台的对象存在,经过序列化后,就可以格式化成能返回给前台的数据

    二. 序列化操作

    1. 视图类的三步操作

      1. ORM操作数据库拿到资源数据
      2. 格式化(序列化)成能返回给前台的数据
      3. 返回格式化后的的数据
    2. 视图类的序列化操作

      1. 直接将要序列化的数据传给序列化类
      2. 要序列化的数据如果是单个对象,序列化的参数many为False,数据如果是多个对象(list,queryset)序列化的参数many为True
    3. 序列化类

      1. model类中要反馈给前台的字段,在序列化类中要进行申明,属性名必须就是model的字段名,且Field类型也要保持一致(不需要明确规则)
      2. model类中不需要反馈给前台的字段,在序列化类中不需要声明(省略)
      3. 自定义序列化字段用 SerializerMethodField() 作为字段类型,该字段的值来源于get_自定义字段名(self,obj)方法的返回值

    三. 反序列化

    1. 视图类的三步操作

      1. 从请求对象中拿到前台的数据
      2. 校验前台数据是否合法
      3. 反序列化成后台model对象与数据库交互
    2. 视图类的反序列化操作

      1. 将要反序列化的数据传给序列化类的data参数
      2. 将反序列化的数据如果是单个字典,反序列化的参数many为False,数据如果是多个字典的列表,反序列化的参数many为True
    3. 反序列化类

      1. 系统的字段,可以在Field类型中设置系统校验规则(name=serilizers.CharField(min_length=3))
      2. required校验规则绝对该字段时必校验还是可选校验字段(默认required为True,数据库字段有默认值或可以为空的字段required可以赋值为False)
      3. 但是需要在自定义校验规则中(局部全局钩子) 将自定义反序列化字段取出(返回剩余的数据与数据库交互)
      4. 局部钩子的方法命名 validate_属性名(self,属性的value),校验规则为 成功返回属性的value 失败抛出校验错误的异常
      5. 全局钩子的方法命名 validate(self,所有属性attrs),校验规则为 成功返回attrs 失败抛出校验错误的异常

    三. 序列化三个类

    Serializer类(了解) --偏底层,开发效率不高

    ModelSerializer类(重中之重) --开发运用阶段才有的序列化方式,开发效率高

    ListSerializer类(正常) --完成群增,群改接口的辅助序列化类

    1. ModelSerializer代码分析

      #先导入ModelSerializer类
      from rest_framework import ModelSerializer
      from rest_framework impoert Serializers
      # 自定义反序列化字段,校验规则只能在声明自定义反序列化字段时设置,且一定是write_only
      re_pwd = serializers.CharField(min_length=3,max_length=64,writ_only=True)
      
      #写一个类继承 ModelSerializer类  这里以User类为例
      class UserModelSerializer(ModelSerializer):
          
          re_pwd = 
          class Meta:   
              # 将序列化类与Model类进行绑定
              models = model.User  
              
              # 1. 设置序列化与反序列化的所有字段(并划分序列化字段和反序列化字段 列表里面默认的是序列化和			反序列化都参与(在你的orm类中没有默认字段的情况下,如果有默认值或空,就不参与反序列化)) 
              
              #2. 必须在orm中的字段 或者是自定义反序列化字段
              fields = ['name','pwd','re_pwd','age','gender']  
              extra_kwargs = {
                  'name' :{
                      'required':True,  #设置不能为空
                      'min_lenght':3,  #设置最短不能短于三位
                      'error_messages':{  #自定义错误信息
                          'min_length':'用户名最短不能短于三位'
                      }
                  },
                  'age':{
                      'min_value':0  #设置最小值
                  },
                  'pwd':{
                      'required':True,
                      'write_only':True  # 只参与反序列化
                  },
                  'gender':{
                      'read_only':True  #只参与序列化 
                      #如果orm类字段中存在 choices 类型
                          # 自定义插拔序列化字段:替换了在Serializer类中自定义的序列化字段								(SerializerMethodField)
         					 # 自定义插拔序列化字段一定不参与反序列化过程
          				#@property
          				#def gender(self):
              				#return self.get_sex_display()
                  }
              }
              
              
          #局部钩子 使用 validata_字段名
          def validata_name(self,value):  #value = name的值
              if 'g' in value.lower():  #判断name的值中是否存在g
                  raise serializer.ValidationError('报错信息')  #如果不满足条件 就抛出错误信息     
               return value  #这里值要返回出去
          
          #全局钩子  判断两次密码是否一致
          def validata(self.attrs)  #attrs就是你列表字段里面的所有的值
           pwd = attrs.get('pwd')
              re_pwd = attrs.pop('re_pwd')
              if pwd != re_pwd:
                  # 不一致 就抛异常
                  raise serializers.ValidationError({'re_pwd': '两次密码不一致'}) 
                  #返回attrs
              return attrs
                  
             
          
              
      

    总结:

    1. ​ 序列化与反序列功能可以整合成一个类,该类继承了ModelSerializer

    2. 继承ModelSerializer类的资源序列化类,内部包含三部分

      Meta子类 局部钩子 全局钩子

      注: create和update方法ModelSerializer已经重写了,使用不需要重写

    3. 在Meta子类中

      1. 用model类绑定关联的model类
      2. 用fields来这是所有的序列化 反序列化字段
      3. 用extra_kwargs来设置系统的校验规则
    4. 重要的字段校验规则:

      1. read_only校验规则: 代表该字段只参与序列化
      2. write_only校验规则: 代表该字段只参与反序列化
      3. required校验规则: 代表该字段在反序列化是否是必填(True) 还是选填(False),不能和read_only一起使用(规则冲突)
        1. 细节1: 如果一个字段有默认值或者是可以为空,没这只required规则,默认是False,反之,默认为True
        2. 细节2 如果一个Model字段没有设置read_only也没有设置 write_only 该字段默认参与序列化和反序列化
    5. 自定义序列化字段:在Model类中,定义方法属性(可以返回特殊值,还可以完成连表操作),在序列化类的fields属性中可以选择性插拔

    6. 自定义反序列化字段: 在Serializer类中,自定义校验字段,校验规则也只能在声明字段时设置,自定义的反序列化字段(如re_pwd),必须设置write_only为True

  • 相关阅读:
    jQuery事件
    php学习注意事项
    取消php上传2M的限制(windows服务器)
    PHP编程值得注意的细节
    jQuery load()方法特殊用法!
    PHP显示乱码和apache内部编码问题的解决
    定制Apache索引样式
    这么长时间也没有人看看我
    加载php5apache2_2.dll失败的处理方法
    WinXP下的ApachePHPMySQL安装和配置
  • 原文地址:https://www.cnblogs.com/kuck/p/11901903.html
Copyright © 2011-2022 走看看