一、定义 Serializer 类
- DRF 中的序列化器需要继承自:
rest_framework.serializer.Serializer
- 在类中定义需要序列化的字段
- serializer 不是只能为数据库模型类定义,也可以为非数据库模型类的数据定义(独立于数据库之外的存在)
二、创建 Serializer 对象
Serializer(instance=None, data=empty, **kwarg)
-
用于序列化时,将模型类对象传入 instance 参数
-
用于反序列化时,将要被反序列化的数据传入 data 参数
-
除了 instance 和 data 参数外,在构造 Serializer 对象时,还可通过 context 参数额外添加数据:
- 如除了 instance 和 data 参数外,在构造 Serializer 对象时,还可通过 context 参数额外添加数据:
serializer = AccountSerializer(account, context={'request': request})
-
通过 context 参数附加的数据可以通过序列化对象的 context 属性获取。
-
注意:
- 使用序列化器的时候一定要注意,序列化器声明了以后,不会自动执行,需要我们在视图中进行调用才可以。
- 序列化器无法直接接收数据,需要我们在视图中创建序列化器对象时把使用的数据传递过来。
- 序列化器的字段声明类似于我们前面使用过的表单系统。
- 开发 restful api 时,序列化器会帮我们把模型数据转换成字典。
- drf 提供的视图会帮我们把字典转换成 json,或者把客户端发送过来的数据转换字典。
三、序列化器的使用
- 序列化器的使用分为两个阶段:
- 在客户端请求(提交)数据时,使用序列化器对数据的
反序列化
- 在服务端响应时,使用序列化器对数据的
序列化
。将模型类数据装换和其他数据装换成 json 格式的数据。
- 在客户端请求(提交)数据时,使用序列化器对数据的
3.1 序列化
假如客户端以 get put (查询 / 修改 一条数据)的请求方式与服务端进行数据交互,其中 urls.py 中的路由匹配为:
即:127.0.0.1:8080/books/1 --> BookView ,并将 pk=1 作为关键字参数传递给它。
此时客户端获取到的数据即为序列化后的书数据。
在 ser.py 对应的序列化类中重写的 update 方法:
3.2 反序列化
假如客户端以 post get (创建一条 / 查询所有)请求方式与服务端进行数据交互,其中 urls.py 的路由匹配为:
即: url 127.0.0.1:8080/books/----> 视图类 BooksView 。
此时服务端保存的就是经过校验和反序列化的客户端发送来的序列化数据。
在 ser.py 对应的序列化类中重写的 create 方法:
3.3 补充 delete
假如客户端以 post get (创建一条 / 查询所有)请求方式与服务端进行数据交互,其中 urls.py 的路由匹配为:
四、数据验证
4.1 is_valid () 方法
- 使用序列化器进行反序列化时,需要对数据进行验证后,才能获取验证成功的数据或保存成模型类对象
- 在获取反序列化的数据前,必须调用 is_valid () 方法进行验证,验证成功返回 True,否则返回 False
- 验证失败:
- 可以通过序列化器对象的 errors 属性获取错误信息,返回字典,包含了字段和字段的错误
- 如果是非字段错误,可以通过修改 REST framework 配置中的 NON_FIELD_ERRORS_KEY 来控制错误字典中的键名
- 验证成功,可以通过序列化器对象的 validated_data 属性获取数据。
- 在定义序列化器时,指明每个字段的序列化类型和选项参数,本身就是一种验证行为。如我们前面定义过的 BookSerializer 。
- is_valid () 方法还可以在验证失败时抛出异常 serializers.ValidationError
- 可以通过传递 raise_exception=True 参数开启,REST framework 接收到此异常,会向前端返回 HTTP 400 Bad Request 响应。
4.2 validate_字段名
例如对 price 字段进行验证,在 BookSerializer 中定义方法:
4.3 validate
4.4 validators
在字段中添加 validators 选项参数,也可以补充验证行为,如
五、模型类序列化器
如果我们想要使用序列化器对应的是 Django 的模型类,DRF 为我们提供了 ModelSerializer 模型类序列化器来帮助我们快速创建一个 Serializer 类。
ModelSerializer 与常规的 Serializer 相同,但提供了:
- 基于模型类自动生成一系列字段
- 基于模型类自动为 Serializer 生成 validators,比如 unique_together
- 包含默认的 create () 和 update () 的实现
5.1 定义
- model 指明参照哪个模型类
- fields 指明为模型类的哪些字段生成
5.2 指定字段
我们可以使用 extra_kwargs 参数为 ModelSerializer 添加或修改原有的选项参数
六、补充
many=True 的实际用途
Serializer 高级用法
source 的使用
- 可以改字段名字 xxx=serializers.CharField (source=‘title’)
- 可以。跨表 publish=serializers.CharField (source=‘publish.email’)
- 可以执行方法 pub_date=serializers.CharField (source=‘test’) test 是 Book 表模型中的方法
SerializerMethodField()
- 它需要有个配套方法,方法名叫 get_字段名,返回值就是要显示的东西
评论区