Django:(08)序列化器

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

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

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

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

 

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

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

 

三、Django中反序列化的参数校验
基本校验:
  序列化器的建立: 经过data传入字典数据:spa

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

 

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

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>字段进行验证blog

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

 

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

  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)

四、模型类序列化器

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

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

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

相关文章
相关标签/搜索