序列化器
序列化器功能
1. 序列化功能
将单个实例对象转换为字典
将多个实例对象转换为字典列表
2. 反序列化功能
数据校验:参数完整性,数据类型
数据保存:新增和更新
序列化器类定义
对比 1 : 模型类定义
from django.db import models
class 模型类名(models.Model):
# 模型类字段 = models.字段类型(选项参数)
# ...
模型类的字段对应的是数据表的字段
对比 2: 序列化器定义
from rest_framework import serializers
class 序列化器类名(serializers.Serializer):
# 序列化器字段 = serializers.字段类型(选项参数)
# ...
- 序列化时,序列化器类的字段对应的是被序列化的对象的属性名
- 反序列化时,序列化器类的字段对应的是传入的字典的key
实例:
# 设置 Django 运行所依赖环境
import os
if not os.environ.get('DJANGO_SETTINGS_MODULE'):
# 'drf_demo.settings'可能发生变化,主要是指你的 django 项目的配置文件路径
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'drf_demo.settings')
# 让 Django 进行一次初始化
import django
django.setup()
序列化器基本使用
使用序列化器时需要先创建一个序列化器类的对象。
格式:
serializer = 序列化器类(instance=None, data={}, **kwargs)
说明:
1)instance:用于序列化时,接收被序列化的实例对象。
2)data:用于反序列化时,接收所要校验的字典数据。
# 示例:使用 UserSerializer 序列化一个User实例对象
# 需求:将如下的 user 对象序列化为字典:{"name": "mikasa8", "age": 18}
if __name__ == '__main__':
# 创建User对象
user = User(name='mikasa8', age=18)
# 创建序列化器对象,传入被序列化的 user 对象
# serializer = UserSerializer(instance=user)
serializer = UserSerializer(user)
# 获取序列化之后的数据
res = serializer.data
print(res)
# 示例:使用 UserSerializer 来完成简单的数据校验
# 需求:使用 UserSerializer 来针对下面的 data 数据进行校验
if __name__ == '__main__':
# 准备数据:此数据在实际中经常是客户端传递的,此处只是模拟
data = {'name': 'mikasa8', 'age': 16}
# 创建序列化器对象,传入待校验的数据
serializer = UserSerializer(data=data)
# 调用is_valid进行数据校验,成功返回True,失败返回False
res = serializer.is_valid()
if res:
# 校验通过,获取校验之后的数据
print('校验通过:', serializer.validated_data)
else:
# 校验失败,获取错误提示信息
print('校验失败:', serializer.errors)
调用 is_valid
时,默认会进行数据完整性,数据类型以及是否满足指定的选项参数限制的校验
选项参数(重点理解)
通用参数:无论哪种字段类型都可以使用的选项参数。
参数名称 | 说明 |
---|---|
read_only | 默认False,若设置为True,表明对应字段只在序列化操作时起作用 |
write_only | 默认False,若设置为True,表明对应字段只在反序列化操作时起作用 |
required | 默认True,表明对应字段在数据校验时必须传入 |
default | 序列化和反序列化时使用的默认值 |
error_messages | 包含错误编号与错误信息的字典 |
label | 用于HTML展示API页面时,显示的字段名称,理解为对字段的注释说明即可 |
注:定义序列化器类的字段时,如果没有指定字段的read_only
和write_only
参数,则这两个参数默认值都为False
,表明对应的字段在序列化和反序列化时都会发挥作用。
总结:
- 序列化器类定义:
- 继承自
serializers.Serializer
- 定义字段:
<字段名>=serializers.字段类型(选项参数)
- 继承自
- 基本使用:
- 创建序列化器类对象:
serializer=<序列化器类>(instance, data, **kwargs)
- 序列化时,将对象传递给
instance
- 反序列化时, 将字典数据传递给
data
- 创建序列化器类对象:
- 选项参数:
read_only
设置为True
,字段只在序列化时起作用write_only
设置为True
,字段只在反序列化时起作用required
默认为True
, 字段在数据校验时必须传入Default
设置序列化和反序列化操作时的默认值max_length
和min_length
设置数据校验时字符串的最大长度和最小长度max_value
和min_value
设置数据校验时数字的最大值和最小值
注意:
validated_data
获取的是校验后的数据
data
是序列化器序列化或反序列化后写入数据库的数据
序列化操作
- 序列化单个对象:创建序列化器对象时,将单个对象传递给
instance
即可 - 序列化多个对象:创建序列化器对象,添加
many=True
参数 - 关联对象嵌套序列化
- 将关联对象序列化为关联对象的主键:
PrimaryKeyRelatedField
- 使用指定的序列化器类将关联对象进行序列化
- 将关联对象序列化为关联对象模型类
__str__
方法的返回值:StringRelatedField
- 如果和被序列化对象关联的对象有多个,定义嵌套序列化字段时,添加
many=True
- 将关联对象序列化为关联对象的主键:
反序列化操作
- 反序列化-基本校验
- 创建序列化器对象,将字典数据传递给 data,调用序列化器的 is_valid 方法进行数据校验
- 反序列化-补充校验
- 针对指定字段添加
validators
选项参数补充验证函数 - 在序列化器类中定义特定方法
validate_<field_name>
针对特定字段进行补充验证 - 在序列化器中定义方法
validate
进行补充验证
- 针对指定字段添加
- 反序列化-数据保存
- 数据校验通过之后,可以调用序列化对象的
save()
方法进行数据保存 save()
方法内部会调用对象序列化器类中的create()
或update()
方法,可以在create()
中实现数据新增,在update()
中实现数据更新
- 数据校验通过之后,可以调用序列化对象的