DRF框架
作者:互联网
DRF框架
https://blog.csdn.net/weixin_44327634/article/details/113444274
https://blog.csdn.net/weixin_44327634/article/details/115430357
https://blog.csdn.net/weixin_44327634/article/details/115470649
序列化和反序列化:
序列化: 把我们识别的数据转换成指定的格式提供给别人。
例如:我们在django中获取到的数据默认是模型对象,但是模型对象数据无法直接提供给前端或别的平台使用,所以我们需要把数据进行序列化,变成字符串或者json数据,提供给别人。
反序列化:把别人提供的数据转换/还原成我们需要的格式。
例如:前端js提供过来的json数据,对于python而言就是字符串,我们需要进行反序列化换成模型类对象,这样我们才能把数据保存到数据库中。
DRF序列化
1. 创建序列化器并使用
(1.1)定义序列化器类:假设已有了一个books应用,并且已有了一个数据库模型类BookInfo,在books应用中新建serializers.py用于保存该应用的序列化器。在该serializers.py中创建一个BookInfoSerializer类用于序列化与反序列化:
model 指明该序列化器处理的数据字段从模型类BookInfo参考生成
fields 指明该序列化器包含模型类中的哪些字段,'all'指明包含所有字段
(1.2)先查询出一个图书对象book:
(1.3)构造序列化器对象serializer:
(1.4)获取序列化数据:
通过data属性可以获取序列化后的数据:serializer.data
(1.5)如果要被序列化的是包含多条数据的查询集QuerySet,可以通过添加many=True参数补充说明
(1.6)如果需要序列化的数据中包含有其他关联对象,则对关联对象数据的序列化需要指明,例如,在定义英雄数据的序列化器时,外键hbook(即所属的图书)字段如何序列化?
首先,先定义HeroInfoSerialzier除外键字段外的其他部分:
然后对于关联字段,可以采用以下几种方式:
1)PrimaryKeyRelatedField:此字段将被序列化为关联对象的主键。
(指明字段时需要包含read_only=True或者queryset参数:
包含read_only=True参数时,该字段将不能用作反序列化使用;
包含queryset参数时,将被用作反序列化时参数校验使用)
使用效果:
2)StringRelatedField:此字段将被序列化为关联对象的字符串表示方式(即__str__方法的返回值)
hbook = serializers.StringRelatedField(label=‘图书’)
使用效果:
3)HyperlinkedRelatedField:此字段将被序列化为获取关联对象数据的接口链接
hbook = serializers.HyperlinkedRelatedField(label='图书', read_only=True, view_name='books-detail')
必须指明view_name参数,以便DRF根据视图名称寻找路由,进而拼接成完整URL。
使用效果:
4)SlugRelatedField:此字段将被序列化为关联对象的指定字段数据
hbook = serializers.SlugRelatedField(label='图书', read_only=True, slug_field='bpub_date')
使用效果:
5)使用关联对象的序列化器:
hbook = BookInfoSerializer()
使用效果:
6)重写to_representation方法:序列化器的每个字段实际都是由该字段类型的to_representation方法决定格式的,可以通过重写该方法来决定格式。注意,to_representations方法不仅局限在控制关联对象格式上,适用于各个序列化器字段类型。
自定义一个新的关联字段:
指明hbook为BookRelateField类型:
使用效果:
补充:如果关联的对象数据不是只有一个,而是包含多个数据,如想序列化图书BookInfo数据,每个BookInfo对象关联的英雄HeroInfo对象可能有多个,此时关联字段类型的指明仍可使用上述几种方式,只是在声明关联字段时,多补充一个many=True参数即可。
2.编写视图
在books应用的views.py中创建视图BookInfoViewSet,这是一个视图集合。
queryset 指明该视图集在查询数据时使用的查询集
serializer_class 指明该视图在进行序列化或反序列化时使用的序列化器
3.定义路由
在books应用的urls.py中定义路由信息。
DRF反序列化
反序列化之验证:
在获取反序列化的数据前,必须调用is_valid()方法进行验证,验证成功返回True,否则返回False。
如果验证失败,可以通过序列化器对象的errors属性获取错误信息,返回字典,包含了字段和字段的错误。
验证成功,可以通过序列化器对象的validated_data属性获取数据。
举例:
验证失败:
验证成功:
除此之外,还可以自定义补充验证行为,有以下三种方法:
1)validate_<field_name>
对<field_name>字段进行验证,如对图书的名称添加限制条件验证:
测试:
2)validate
在序列化器中需要同时对多个字段进行比较验证时,可以定义validate方法来验证:
测试:
3)validators
在字段中添加validators选项参数,也可以补充验证行为:
测试:
反序列化之保存
验证成功后,想要完成数据对象的创建,可以通过实现create()和update()两个方法来实现:
若在完成数据对象的创建后,想要把数据对象保存到数据库中,则可以:
实现了上述两个方法后,在反序列化数据的时候,就可以通过save()方法进行新建或更新了。
注意:如果创建序列化器对象的时候,没有传递instance实例,则调用save()方法的时候,create()被调用,相反,如果传递了instance实例,则调用save()方法的时候,update()被调用。
如:没有传递instance实例,调用save()方法的时候,create()被调用的情况:
如:传递了instance实例,调用save()方法的时候,update()被调用的情况:
两点补充说明:
1) 在对序列化器进行save()保存时,可以额外传递数据,这些数据可以在create()和update()中的validated_data参数获取到:
2)默认序列化器必须传递所有required的字段,否则会抛出验证异常。但是我们可以使用partial参数来允许部分字段更新:
注意,如果用partial参数来允许部分字段更新的前提是其他字段的额外验证也要满足要求才可以成功。
标签:框架,验证,对象,关联,指明,序列化,数据,DRF 来源: https://www.cnblogs.com/EtAl0rs/p/16359045.html