ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

DRF框架

2022-06-09 14:04:37  阅读:235  来源: 互联网

标签:框架 验证 对象 关联 指明 序列化 数据 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类用于序列化与反序列化:image-20220531112030783

model 指明该序列化器处理的数据字段从模型类BookInfo参考生成
fields 指明该序列化器包含模型类中的哪些字段,'all'指明包含所有字段

(1.2)先查询出一个图书对象book:image-20220531114140987

(1.3)构造序列化器对象serializer:

image-20220531113946321

(1.4)获取序列化数据:
通过data属性可以获取序列化后的数据:serializer.dataimage-20220531114656880

(1.5)如果要被序列化的是包含多条数据的查询集QuerySet,可以通过添加many=True参数补充说明image-20220531114820725

(1.6)如果需要序列化的数据中包含有其他关联对象,则对关联对象数据的序列化需要指明,例如,在定义英雄数据的序列化器时,外键hbook(即所属的图书)字段如何序列化?
首先,先定义HeroInfoSerialzier除外键字段外的其他部分:image-20220531135050139

然后对于关联字段,可以采用以下几种方式:
1)PrimaryKeyRelatedField:此字段将被序列化为关联对象的主键。image-20220531135149425
(指明字段时需要包含read_only=True或者queryset参数:
包含read_only=True参数时,该字段将不能用作反序列化使用;
包含queryset参数时,将被用作反序列化时参数校验使用)

使用效果:image-20220531135227342

2)StringRelatedField:此字段将被序列化为关联对象的字符串表示方式(即__str__方法的返回值)

hbook = serializers.StringRelatedField(label=‘图书’)

使用效果:image-20220531135421809

3)HyperlinkedRelatedField:此字段将被序列化为获取关联对象数据的接口链接

hbook = serializers.HyperlinkedRelatedField(label='图书', read_only=True, view_name='books-detail')

必须指明view_name参数,以便DRF根据视图名称寻找路由,进而拼接成完整URL。

使用效果:

image-20220531135608991

4)SlugRelatedField:此字段将被序列化为关联对象的指定字段数据

hbook = serializers.SlugRelatedField(label='图书', read_only=True, slug_field='bpub_date')

使用效果:image-20220531135648730

5)使用关联对象的序列化器:

hbook = BookInfoSerializer()

使用效果:image-20220531135740325

6)重写to_representation方法:序列化器的每个字段实际都是由该字段类型的to_representation方法决定格式的,可以通过重写该方法来决定格式。注意,to_representations方法不仅局限在控制关联对象格式上,适用于各个序列化器字段类型。

自定义一个新的关联字段:image-20220531135914881

指明hbook为BookRelateField类型:image-20220531135926102

使用效果:image-20220531135940742

补充:如果关联的对象数据不是只有一个,而是包含多个数据,如想序列化图书BookInfo数据,每个BookInfo对象关联的英雄HeroInfo对象可能有多个,此时关联字段类型的指明仍可使用上述几种方式,只是在声明关联字段时,多补充一个many=True参数即可。

2.编写视图

在books应用的views.py中创建视图BookInfoViewSet,这是一个视图集合。image-20220531112411772

queryset 指明该视图集在查询数据时使用的查询集
serializer_class 指明该视图在进行序列化或反序列化时使用的序列化器

3.定义路由

在books应用的urls.py中定义路由信息。

image-20220531112501416

DRF反序列化

反序列化之验证:

在获取反序列化的数据前,必须调用is_valid()方法进行验证,验证成功返回True,否则返回False。

如果验证失败,可以通过序列化器对象的errors属性获取错误信息,返回字典,包含了字段和字段的错误。

验证成功,可以通过序列化器对象的validated_data属性获取数据。

举例:

验证失败:image-20220531141002652

验证成功:image-20220531141014294

除此之外,还可以自定义补充验证行为,有以下三种方法:

1)validate_<field_name>
对<field_name>字段进行验证,如对图书的名称添加限制条件验证:image-20220531141438475

测试:image-20220531141451827

2)validate
在序列化器中需要同时对多个字段进行比较验证时,可以定义validate方法来验证:image-20220531141534511

测试:image-20220531141604329

3)validators
在字段中添加validators选项参数,也可以补充验证行为:image-20220531141640953

测试:image-20220531141705976

反序列化之保存

验证成功后,想要完成数据对象的创建,可以通过实现create()和update()两个方法来实现:image-20220531142645542

若在完成数据对象的创建后,想要把数据对象保存到数据库中,则可以:image-20220531142718260

实现了上述两个方法后,在反序列化数据的时候,就可以通过save()方法进行新建或更新了。
注意:如果创建序列化器对象的时候,没有传递instance实例,则调用save()方法的时候,create()被调用,相反,如果传递了instance实例,则调用save()方法的时候,update()被调用。

如:没有传递instance实例,调用save()方法的时候,create()被调用的情况:image-20220531143328551

如:传递了instance实例,调用save()方法的时候,update()被调用的情况:image-20220531143433678

两点补充说明:

1) 在对序列化器进行save()保存时,可以额外传递数据,这些数据可以在create()和update()中的validated_data参数获取到:image-20220531143612229

2)默认序列化器必须传递所有required的字段,否则会抛出验证异常。但是我们可以使用partial参数来允许部分字段更新:image-20220531143639483

​ 注意,如果用partial参数来允许部分字段更新的前提是其他字段的额外验证也要满足要求才可以成功。

标签:框架,验证,对象,关联,指明,序列化,数据,DRF
来源: https://www.cnblogs.com/EtAl0rs/p/16359045.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有