DRF框架是基于Django框架的.而DRF Serializer序列化器可以实现接口开发的高度复用.
Django REST framework中的Serializer使用类来定义,须继承自rest_framework.serializers.Serializer
注意:serializer不是只能为数据库模型类定义,也可以为非数据库模型类的数据定义。serializer是独立于数据库之外的存在
字段与选项
常用字段有:BooleanField CharField IntegerField …
选项参数:max_length min_lenght max_value …
通用参数:read_only write_only required default allow_null validators error_messages label help_text
创建Serializer对象
定义好Serializer类后,就可以创建Serializer对象了
Serializer(instance=None, data=empty, **kwarg)
先查询出一个图书对象
book = BookInfo.objects.get(id=2)
构造序列化器对象
serializer = BookInfoSerializer(book)
获取序列化数据
通过data属性可以获取序列化后的数据 serializer.data
如果要被序列化的是包含多条数据的查询集QuerySet,可以通过添加many=True参数补充说明
关联对象嵌套序列化
如果需要序列化的数据中包含有其他关联对象,则对关联对象数据的序列化需要指明
对于关联字段,可以采用以下几种方式:
1) PrimaryKeyRelatedField 此字段将被序列化为关联对象的主键
2) StringRelatedField 此字段将被序列化为关联对象的字符串表示方式(即__str__方法的返回值)
3)使用关联对象的序列化器 hbook = BookInfoSerializer()
many参数
如果关联的对象数据不是只有一个,而是包含多个数据,如想序列化图书BookInfo数据,每个BookInfo对象关联的英雄HeroInfo对象可能有多个,此时关联字段类型的指明仍可使用上述几种方式,只是在声明关联字段时,多补充一个many=True参数即可
1,验证:(类型验证,属性验证)使用序列化器进行反序列化时,需要对数据进行验证后,才能获取验证成功的数据或保存成模型类对象
在获取反序列化的数据前,必须调用is_valid()方法进行验证,验证成功返回True,否则返回False。
验证失败,可以通过序列化器对象的errors属性获取错误信息,返回字典,包含了字段和字段的错误。如果是非字段错误,可以通过修改REST framework配置中的NON_FIELD_ERRORS_KEY来控制错误字典中的键名。
验证成功,可以通过序列化器对象的validated_data属性获取数据
在定义序列化器时,指明每个字段的序列化类型和选项参数,本身就是一种验证行为
方法验证:
单一字段验证方法:
1)validate_
def validate_btitle(self, value):
if 'django' not in value.lower():
raise serializers.ValidationError("图书不是关于Django的") (要点1)
return value (要点2)
多个字段验证方法:
在序列化器中需要同时对多个字段进行比较验证时,可以定义validate方法来验证
2)validate
def validate(self, attrs):
bread = attrs['bread']
bcomment = attrs['bcomment']
if bread < bcomment:
raise serializers.ValidationError('阅读量小于评论量')
return attrs
3)validators 在字段中添加validators选项参数,也可以补充验证行为
btitle = serializers.CharField(label=‘名称’, max_length=20, validators=[about_django])
about_django是在外面定义的一个方法,
2.保存
如果在验证成功后,想要基于validated_data完成数据对象的创建,可以通过实现create()和update()两个方法来实现。
ser.save()是序列化器对象的save方法
instance.save()是模型类对象方法
实现了上述两个方法后,在反序列化数据的时候,就可以通过save()方法返回一个数据对象实例了
如果创建序列化器对象的时候,没有传递instance实例,则调用save()方法的时候,create()被调用,相反,如果传递了instance实例,则调用save()方法的时候,update()被调用。
新建: def create(self, validated_data):
更新: def update(self, instance, validated_data):
如果我们想要使用序列化器对应的是Django的模型类,DRF为我们提供了ModelSerializer模型类序列化器来帮助我们快速创建一个Serializer类。
ModelSerializer与常规的Serializer相同,但提供了:
基于模型类自动生成一系列字段
基于模型类自动为Serializer生成validators
包含默认的create()和update()的实现
1,定义
2,指定字段
使用fields来明确字段
使用exclude来明确排除掉哪些字段
默认ModelSerializer使用主键作为关联字段,可以使用depth来简单的生成嵌套表示,depth应该是整数,表明嵌套的层级数量
显示指明字段
指明只读只读 通过read_only_fields指明只读字段,即仅用于序列化输出的字段
3,添加额外参数
可以使用extra_kwargs参数为ModelSerializer添加或修改原有的选项参数