DRF序列化使用
1-序列化和反序列化的流程说明
-
序列化过程
- 获取数据库中的数据对象所对应的字段数据—》转化为json返回前端从后端服务——》前端服务
-
反序列化过程
- 获取前端数据——》验证数据——》保存或更新数据获取新的数据对象从前端服务器——》后台服务器
-
DRF框架的功能:
-
Serializer序列化器
-
视图
-
认证,权限,限流,过滤,排序,分页,异常处理,自动生成接口文档
-
-
在一个功能业务逻辑中可以包含序列化器和反序列化器
2-DRF的配置
-
安装drf
pip install djangorestframework
-
注册应用rest_framework
3-序列化器中序列化过程的基本使用
定义Serializer
定义方法
Django REST framework中的Serializer使用类来定义,须继承自rest_framework.serializers.Serializer。
**serializer不是只能为数据库模型类定义,也可以为非数据库模型类的数据定义。**serializer是独立于数据库之外的存在。
-
序列化过程
- 创建serializer.py文件
- 继承serializers.Serializer创建类
- 指定序列化器返回字段
- 查询数据
- 创建序列化器对象,传入查询集
- JsonResponse()返回
-
返回多个数据对象时
-
序列化器对象创建时需写入关键字参数many = True
-
JsonResponse()中需要写入关键字参数safe = False
-
4-创建Serializer对象
定义好Serializer类后,就可以创建Serializer对象了。
Serializer的构造方法为:
Serializer(instance=None, data=empty, **kwarg)
说明:
1)用于序列化时,将模型类对象传入instance参数
2)用于反序列化时,将要被反序列化的数据传入data参数
3)除了instance和data参数外,在构造Serializer对象时,还可通过context参数额外添加数据,如
serializer = AccountSerializer(account, context={'request': request})
通过context参数附加的数据,可以通过Serializer对象的context属性获取。
5-序列化中的data方法的原理说明
- data是一个方法,根据序列化器中接收到的查询集构造字典形式的数据
6-序列化中嵌套序列化的主表嵌套副表使用 `
-
关联嵌套序列化器
-
PrimaryKeyRelatedField 此字段将被序列化为关联对象的主键
-
hbook = serializers.PrimaryKeyRelatedField(label='图书', read_only=True)
-
StringRelatedField 此字段将被序列化为关联对象的字符串表示方式(即__str__方法的返回值)
-
hbook = serializers.StringRelatedField(label='图书')
-
使用关联对象的序列化器
-
hbook = BookInfoSerializer()
-
-
如果是一对多形式需要使用 many=True
7-序列化中副表嵌套主表返回的使用
-
调用形式与主表嵌套附表使用形式相同,但不需要使用many = True
-
如果相互嵌套会发生错误(类似于死循环)
- 解决办法,可重新定义新的序列化器,构造内容一致
8-序列化使用小结
-
序列化返回时
-
主表嵌套副表返回,属性名为副表的小写形式_set
-
副表嵌套主表返回,属性名为关联外键
-
-
write_only = True只参与反序列化过程
-
read_only=True只参与序列化过程