zoukankan      html  css  js  c++  java
  • Django:(08)序列化器

    1、序列化和反序列化
    变量从内存中变成可存储或传输的过程称之为序列化,序列化之后,就可以把序列化后的内容写入磁盘,或者通过网络传输到别的机器上。
    反过来,把变量内容从序列化的对象重新读到内存里称之为反序列化。

    序列化是将对象状态转换为可保持或可传输的形式的过程。序列化的补集是反序列化,后者将流转换为对象。这两个过程一起保证数据易于存储和传输。

    2、Django中序列化器的定义和使用
    定义:两种方法定义序列化器(serializer/ModelSerializer)

    class CartSKUSerializer(serializers.ModelSerializer):
        """
        购物车商品数据序列化器
        """
        count = serializers.IntegerField(label='数量')
    
        class Meta:
            model = SKU
            fields = ('id', 'name', 'default_image_url', 'price', 'count')

    使用:
      查询模型类
      实例一个序列化器,传入模型类对象
      获取序列化后的结果(data属性)

    query_set = Department.objects.all()
    serializer = DepartmentSerializer(query_set, many=True)# 传入对象集时需指定many=True
    serializer.data

    3、Django中反序列化的参数校验
    基本校验:
      序列化器的创建: 通过data传入字典数据:

    Serializer(instance=None, data=empty, **kwarg)

      通过is_valid方法校验参数合法性
      errors属性: 获取校验出错信息,字典类型。
      validated_data属性: 校验通过得到的对象,类型为OrderedDict
    通过 validators选项校验
      在序列化器字段中添加validators选项参数进行校验
      定义函数:

    def validate_name(value):
        # 校验部门名称
        if not re.match('^[u4e00-u9fa5]+$', value):
            raise ValidationError('部门名称只能为中文')
        return value

      在字段参数中添加选项:validators=[validate_name]

    name = serializers.CharField(validators=[validate_name])

    validate_<field>:对<field_name>字段进行验证

        class DepartmentSerializer(serializers.Serializer):
        """部门数据序列化器"""
        ...
        def validate_name(self, value):
            # 校验部门名称
            if not re.match('^[u4e00-u9fa5]+$', value):
                raise ValidationError('部门名称只能为中文')
            return value

    validate:同时对多个字段进行比较验证

         # 模型: users/models.py
     class User(models.Model):
         password = models.CharField(max_length=30)
    
     # 序列化器: users/serializer.py
     class UserSerializer(serializers.Serializer):
    
         password = serializers.CharField(max_length=30, write_only=True)
         password2 = serializers.CharField(max_length=30, write_only=True)
    
         def validate(self, attrs):
             # 校验两次输入的密码是否正确
             password = attrs['password']
             password2 = attrs['password2']
             if password != password2:
                 raise serializers.ValidationError('两次输入的密码不一样')
             return attrs

    3、Django中反序列化保存和修改数据

    1. Serializer类的三个方法

      • save()方法: 保存数据
      • create()方法: 新增数据
      • update()方法: 修改数据
    2. 新增或修改数据

      Serializer(instance=None, data=empty)
      1. 新增:创建序列化器时,没有传递了instance参数

         my_dict = {'name': '研发部xx', 'create_date': '2018-1-1'}
         s = DepartmentSerializer(data=my_dict)    
         s.save()        # 新增
      2. 修改:创建序列化器时,传递了instance参数

        department = Department.objects.get(id=1)
         my_dict = {'name': '研发部xx', 'create_date': '2018-1-1'}
         s = DepartmentSerializer(instance=department, data=my_dict)    
         s.save()        # 修改
      3. 部分修改:partial=True 参数

        1. 当修改数据时,序列化器默认要求传递所有required=True的字段,否则is_valid验证不通过
        2. 可以通过设置partial=True允许只修改部分字段,如下:

    s = DepartmentSerializer(department, data={'create_date': '2017-1-1'}, partial=True)

    4、模型类序列化器

    定义
      model 指明参照哪个模型类
      fields 指定序列化器中的属性有哪些 (可以是模型类中的字段,也可以模型类中没有的但需要校验的属性,比如类似:短信验证码,确认密码)

    class DepartmentSerializer2(serializers.ModelSerializer):
        class Meta:
            model = Department 
            fields = '__all__' # 包含模型类中所有的字段

    指定序列化器中包含哪些字段:fields = ('id', 'name')
    排除掉模型类中指定的字段:exclude = ('is_delete',)
    指明只读字段
      read_only_fields = ('id', 'create_date')
      仅用于序列化输出,在反序列化时不会进行校验和修改
    指定 关联属性的序列化方式

  • 相关阅读:
    selenium 18种元素定位方法
    python3+selenium配置可能报错记录
    adb+monkey压力测试入门
    appscan使用教程(全)
    appium---android元素定位
    QTP自动化测试
    postman Could not get any response。
    Jmeter接口测试+压力测试
    Android 偏门xml属性
    CrashHandler
  • 原文地址:https://www.cnblogs.com/mzfly/p/10009283.html
Copyright © 2011-2022 走看看