1.DRF框架定义的序列化流程
1.狭义上的序列化定义
数据流向:后端到前段
后端负责处理数据处理流程:
模型类对象–》字典–》json字符串(DRF约定的序列化流程)
1.通过Django模型类获取数据库数据构建模型类对象
2.把模型类对象转化为字典
3.把字典转化为json格式的字符串
2.DRF框架的反序列化流程
数据流向:前段到后端
json字符串–>字典–>数据校验(产生有效数据)–>模型类对象(新建,更新)
二进制转化为字符串再转化为json字符串
字符串转化为字典
数据校验
模型类对象
数据库增删改查中的DRF约定的序列化和反序列化业务
查询(序列化):模型类对象–>字典–>json字符串
新增(反序列化):json字符串–>字典–>数据校验–>有效数据–>新建模型对象
更新(反序列化):json字符串–>字典–>数据校验–>有效数据–>更新模型对象
删除(规定为反序列化):根据路径pk删除模型类对象
2.广义上的序列化定义
定义:相同的数据在不同类型(表现形式)之间的转化,称之为序列化,反序列化是与序列化相对的过程:序列化是一个过程,中间可能经过多层转化(我们往往最主要关注的是首尾)
a = {"name":"yangyadong", "age":18}
a:类型是字典,值(记录的数据)是一个人的信息(键值对)
b = '{"name":"yangyadong", "age":18}'
b:类型是字符串(json格式),
import json
b = json.dumps(a)
a = json.loads(b)
c = [("name","yangyadong"), ("age",18)]
c :列表嵌套元组(元组恒定2个元素)
a = dict(c)
c-->a:遍历
字典,列表,字符串,元组,集合,json字符串
序列化器(Serializer)
定义:用来执行序列化/反序列化操作的一个工具
对象:操作模型类
作用:
功能;
- 序列化:模型类对象–》使用序列化器–>字典—>Json字符串
- 反序列化器:Json字符串–>字典–>交给序列化器–>有效数据–>新建/更新模型类
- 模型类隐藏字段也可以映射,只要模型类有的字段都可以映射
2.序列化器的定义
3.序列化器之序列化操作
3.2关联嵌套序列化
两大方向,三种形式
方向一:序列化主表数据的时候顺带着序列化关联从表多个数据;
方向二:序列化从表数据的时候,顺带着序列化关联总表多个数据;
形式一:关联字段的类型定义成:PrimaryKeyRelatedField(queryset,many)
- queryset=锻炼模型类的查询集 # 作用域反序列化
- many=True表示表示关联字段是多个对象的时候设置的(关联字段是从表多条数据)
形式二:StringRelatedField:把关联对象
4.序列化器之反序列化操作
4.1 反序列化操作值标准校验流程
4.2反序列化操作之标准新建/更新流程
在子应用里创建serializers.py
from rest_framework import serializers
# 1. 定义BookInfo模型类的序列化器
class BookInfoSerializers(serializers, Serializer):
# 2. 通过定义模型类,同名类属性,类型一一对应的形式,来指定参与序列化的字段,决定序列化结果(字典)有哪些字段
btitle = serializers.CharField()
bpub_date = serializers.DateField()
bread = serializers.IntegerField()
is_delete = serializers.BooleanField()
image = serializers.ImageField()
标准序列化流程
-
获取目标数据(一个或者多个模型类对象)
-
实例化序列化器对象
- 单一对象序列化:BookInfoSerializer(instance = book)
- 多个对象序列化:BookInfoSerializer(instance = books, many = True)
-
序列化结果
- 单一对象序列化结果(dict):bs.data
- 多个对象序列化结果(OrderedDict):bs.data
序列化单一对象
-
获取目标数据(被序列化操作的模型类对象,一个或者多个)
-
实例化序列化器对象
-
获取序列化的结果
python3 manage.py shell
from Books.models import *
from Book.serializers import *
book = BookInfo.objects.all()[0]
bs = BookInfoSerializer(instance = book)
bs.data
序列化多个对象
python3 manage.py shell
from Books.models import BookInfoSerializers
#1. 获取目标数据(被序列化操作的模型类对象,一个或者多个)
books = BookInfo.objects.all()
books
#2.实例化序列化器对象(传入目标数据)
bs = BookInfoSerializer(instance = books, many = True)
#3.获取序列化的结果
bs.data
b1 = bs.data[0]
b1
b1.get('title')
模型类三大属性:ID(主键)
id = serializers.IntegerField()
related_named定义一个主表隐藏字段为heros