一、序列化与反序列化
1.序列化
概念:将程序中的一个数据结构类型转化为其它格式(字典、json、XML等)。例如:将django中的模型类对象转换为json字符串,这个转换过程称之为序列化
序列化时机:当需要给前端响应模型数据时,需要将模型数据序列化成前端需要的格式
2.反序列化
概念:将其它格式 (字典、json、XML等)转换为程序中的数据,例如:将json字符串转换为django中的模型类对象,这个过程称之为反序列化
反序列化时机:当需要将用户发送的数据存储到数据库之前,需要使用反序列化
3.开发Restful接口时
视图中做的最主要的三件事:
- 将请求的数据(如:Json格式)转换为模型类对象(反序列化
- 操作数据库
- 将模型类对象转换为响应的数据(如:Json格式)(序列化)
在视图中需要做的最核心的事:
- 将数据库数据序列化为前端所需要的格式,并返回
- 将前端发送的数据反序列化为模型类对象,并保存到数据库中
二、常用序列化器类
1、serializers.Serializer
子应用下先创建一个名为serializers.py的模块,在该模块下需要引入serializers模块,并创建序列化器类ProjectsSerializer继承serializers.Serializer父类
from rest_framework import serializers
class ProjectSerializer(serializers.Serializer):
name = serializers.CharField(max_length=200, label="项目名称", help_text='项目名称')
leader = serializers.CharField(max_length=50, label="项目负责人", help_text='项目负责人')
programmer = serializers.CharField(max_length=50, label="开发人员", help_text="开发人员")
tester = serializers.CharField(max_length=50, label="测试人员", help_text="测试人员")
字段说明:
max_length
最大长度:在反序列化时进行输入最大长度校验
min_length
最小长度:在反序列化时进行输入最小长度校验
allow_blank
是否允许为空:在反序列化时允许传空白字符串,默认不允许
max_value
最大值:在反序列化时进行输入最大值校验
min_value
最小值:在反序列化时进行输入最小值校验
read_only
表明该字段仅用于序列化输出,但在反序列化验证时不做校验,默认False
write_only
表明该字段仅用于反序列化输入,但在序列化时不进行输出,默认False
required
表明该字段在反序列化时必须输入,序列化时必须输出,默认True
default
反序列化时使用的默认值,如果不指明,在传递时默认值为0
allow_null
表明该字段是否允许传入None,默认False
validators
该字段使用的验证器
error_messages
包含错误编号与错误信息的字典
label
用于HTML展示API页面时,显示的字段名称,相当于模型类字段的verbose_name属性
help_text
用于HTML展示API页面时,显示的字段帮助提示信息
(1)序列化模型类对象
在视图类模块下,返回的为模型类对象时,使用步骤如下:
- 实例化一个序列化器类,将模型类对象传给instance变量,并返回一个序列化器类对象
- 调用序列化器类对象的data属性后传入JsonResponse并return
obj = Projects.objects.get(id__exact=pk)
serializer_obj = ProjectSerializer(instance=obj)
return JsonResponse(serializer_obj.data)
(2)序列化查询集
在视图类模块下,返回的为查询集时,使用步骤如下:
- 实例化一个序列化器类,将模型类对象传给instance变量,并且设置many为True,并返回一个序列化器类对象
- 调用序列化器类对象的data属性后传入JsonResponse,设置safe=False,并return
qs = Projects.objects.all()
serializer_obj = ProjectSerializer(instance=qs, many=True)
return JsonResponse(serializer_obj.data, safe=False)
(3)需自定义create和update方法
def create(self, validated_data):
# validated_data参数为校验通过之后的数据
# 必须将创建成功的模型类对象返回
obj = Projects.objects.create(**validated_data)
return obj
def update(self, instance, validated_data):
# instance为待更新的模型类对象
# validated_data参数为校验通过之后的数据
# 必须将更新成功的模型类对象返回
instance.name = validated_data.get('name') or instance.name
instance.leader = validated_data.get('leader') or instance.leader
instance.tester = validated_data.get('tester') or instance.tester
instance.programmer = validated_data.get('programmer') or instance.programmer
instance.desc = validated_data.get('desc') or instance.desc
instance.save()
return instance
2、serializers.ModelSerializer
子应用下先创建一个名为serializers.py的模块,在该模块下需要引入serializers模块,并创建序列化器类ProjectsModelSerializer继承serializers.ModelSerializer父类
2.1 特性
- 1.filed字段不需要自己写,与模型一一对应
基于模型类的字段条件创建约束 - 2.ModelSerializer中定义了与本来需要序列化字段同名的字段,会覆盖原来的模型类映射的字段
- 3.简单的实现了create和update方法,可根据需求重写
调用父类的creat和update方法时,validated_data不需要解包
- super().update(instance, validated_data)
- super().create(validated_data)
2.2 自定义Meta参数属性
mode:关联的模型类
fields:
- 使用fields来明确字段, 可以写明具体哪些字段
- 也可以写all,所有字段都生成序列化规则
exclude:可以明确排除掉哪些字段
read_only_fields:指明只读字段,即仅用于序列化输出的字段
extra_kwargs:为ModelSerializer添加或修改原有的选项参数,来定制某些字段(嵌套字典)