1. ListField
当需要接收一个 list 的时候使用。
参数:
child
- 应该用于验证列表中对象的字段实例。如果未提供此参数,则将不验证列表中的对象。
min_length
- 验证列表中包含的元素不少于此数量。
max_length
- 验证列表中所包含的元素数量不超过此数量。
# 传入的list 中必需是 int 类型
serializers.ListField(child=serializers.IntegerField())
2. DictField
当传入的数据是 dict 时使用。
参数:
child
- 应该用于验证字典中值的字段实例。如果未提供此参数,则将不验证映射中的值。
allow_empty
- 指定是否允许空字典。
# 注意,当设置 child 后 dict 只能是一维
serializers.DictField(child=serializers.IntegerField())
3. 自定义字段类型
自定一的字段类可以继承
serializers.Field
标准字段类。也可以继承已存在的类进行重构
from rest_framework import serializers
class CustomField(serializers.Field):
# 这个方法可以操作数据库存储的数据,进行自定义序列化
def to_representation(self, value):
pass
# 对出入的数据进行操作
def to_internal_value(self, data):
pass
4. 当传入数据是 dict 存入数据库是 yaml 时
当传入的数据是 dict ,存入数据库的数据是 yaml 时,使用默认
DictField
在返回数据时会报错。根据报错信息翻看源码发现在调用to_representation
时,因为DictField
的to_representation
是处理 dict 数据的,所以会报错。
源码
def to_representation(self, value):
# 这里 value 的数据会是 yaml 格式的字符串 value.items() 时报错
# 因为这里是处理 dict 数据时使用的
return {
str(key): self.child.to_representation(val) if val is not None else None
for key, val in value.items()
}
解决办法重写 DictField
的 to_representation
方法
class StratagyField(serializers.DictField):
def to_representation(self, value):
return yaml.load(value, Loader=yaml.FullLoader)
网友评论