欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

DRF Serializer序列化器使用

程序员文章站 2022-07-12 11:20:54
...

笔记:Serializer序列化器

1,序列化器的作用:

DRF框架是基于Django框架的.而DRF Serializer序列化器可以实现接口开发的高度复用.

  • 1,进行数据的校验
  • 2,对数据对象进行转换

1,定义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)

2,序列化的使用

先查询出一个图书对象

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参数即可

3,反序列化的使用

1,验证:(类型验证,属性验证)使用序列化器进行反序列化时,需要对数据进行验证后,才能获取验证成功的数据或保存成模型类对象
在获取反序列化的数据前,必须调用is_valid()方法进行验证,验证成功返回True,否则返回False。
验证失败,可以通过序列化器对象的errors属性获取错误信息,返回字典,包含了字段和字段的错误。如果是非字段错误,可以通过修改REST framework配置中的NON_FIELD_ERRORS_KEY来控制错误字典中的键名。
验证成功,可以通过序列化器对象的validated_data属性获取数据
在定义序列化器时,指明每个字段的序列化类型和选项参数,本身就是一种验证行为

方法验证:
单一字段验证方法:
1)validate_<field_name> 对<field_name>字段进行验证

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):

4,模型类序列化器ModelSerializer

如果我们想要使用序列化器对应的是Django的模型类,DRF为我们提供了ModelSerializer模型类序列化器来帮助我们快速创建一个Serializer类。
ModelSerializer与常规的Serializer相同,但提供了:
基于模型类自动生成一系列字段
基于模型类自动为Serializer生成validators
包含默认的create()和update()的实现

1,定义
2,指定字段
使用fields来明确字段
使用exclude来明确排除掉哪些字段
默认ModelSerializer使用主键作为关联字段,可以使用depth来简单的生成嵌套表示,depth应该是整数,表明嵌套的层级数量
显示指明字段
指明只读只读 通过read_only_fields指明只读字段,即仅用于序列化输出的字段
3,添加额外参数
可以使用extra_kwargs参数为ModelSerializer添加或修改原有的选项参数

相关标签: Serializer