What is serializers?
serializers主要作用是将原生的Python数据类型(如 model querysets )转换为web中通用的JSON,XML或其他内容类型。
DRF 提供了一个Serializer类,它为您提供了种强大的通用方法来控制响应的输出,以及一个ModelSerializer 类,它为创建处理 model instance 和 serializers 提供了一个序列化的快捷方式。
Reference
How to Declaring Serializers?
序列化一个django model
| |
声明Serializers,可以用来序列化与反序列化对象 Comment的属性及值。
| |
序列化及反序列化
序列化
| |
反序列化
反序列化是将json数据流解析为python的数据类型,后映射至对象
| |
数据的落地
如果需要对经过认证的数据进行保存入库,需要实现对应 serializer的 create() 和 update() 方法
| |
| |
save()
save() 可以创建或更新一个实例(实例是值库中的行)。
| |
How to Use validate?
validate是值在反序列化数据时,需要对数据进行验证(如,长度,值,类型),即在数据落地前,对其制定的规则进行验证。
| |
.is_valid() 是对数据的验证。raise_exception 是一个可选参数,如果 serializers.ValidationError如果存在验证错误,将引发异常。异常由 REST framework 提供的默认异常处理程序自动处理,并HTTP 400 Bad Request默认返回响应。
| |
字段的验证
自定义验证
单字段验证
通过子类 .validate_<field_name> 方法进行自定义验证方式,该方法需要返回验证的值或触发serializers.ValidationError. 例如:
| |
类级别验证
如果需要对多个字段进行验证验证,需要在类中实现validate() 方法。该方法仅单个参数 data, 为验证的字段的字典。例如
| |
忽略验证
注意:如在Serializer 的<field_name> 声明了参数required=False 则该字段不会进行验证。
指定验证器
Serializer 的<field_name> 还可以声明 validator,例如,
| |
validator Reference
ModelSerializer
ModelSerializer,是drf为了方便实现好的可以直接用的Serializer。实现为:
- 将根据模型自动为您生成一组字段。
- 将自动为Serializer程序生成validator,例如 unique_together 验证器。
- 包括简单的实现默认的
.create()和.update()。
ModelSerializer的声明
| |
Meta的说明
Meta 类,如名称可知,这是设置Serializer的一些元数据。包含Model,Filed, Validator等信息,例如声明一个Meta类。
| |
注:从 3.3.0 版开始,必须提供以下属性之一
fields或exclude.
Serializer会在Meta中拿取自己对应的属性进行使用,例如
| |
其他用法
设置只读字段:字段属性中添加 read_only=True, 或者在Meta类中添加属性 中指定字段 read_only_fields 为列表。
Serializer的字段与字段属性属性
Reference
字段属性
read_only在创建或更新时改属性True字段都被忽略write_only仅为创建或更新时使用,序列化时不操作该字段required默认情况下,在反序列化时未提供字段会引发错误,如果不需要可以设置为Falsesource:- 用于序列化时,填充替代对应字段名称的作用
URLField(source='get_absolute_url') - 可以跨表
- 可以执行对象内方法。
- 用于序列化时,填充替代对应字段名称的作用
Many: 可以返回多个对象,而非一个,在objects.all时使用
字段类型
BooleanField()CharField(max_length=None, min_length=None, allow_blank=False, trim_whitespace=True)文本字段EmailField(max_length=None, min_length=None, allow_blank=False)email字段RegexField(regex, max_length=None, min_length=None, allow_blank=False)正则表达式IPAddressField(protocol='both', unpack_ipv4=False, **options)IP地址SerializerMethodField(method_name=None)通过方法序列化,只读字段method_name序列化时通过方法的名称。默认为get_<field_name>.