? ? ?rest_framework是一个基于django的框架,可以看作是django的第三方库,库提供最基础功能就是方便开发restful接口。同时该第三方库,也是实现了django app的环境(或者说该库是以django app方式封装的一个package),可以作为app注册到django项目中,提供一些已经完成好的web应用功能(如登录API功能,提供基于token的身份认证及其model等,减少业务上重复开发业务逻辑)。
? ? ? rest_framework作为django的三方库(或者叫django生态中的组件), 提供了很多模块。
记忆集会遇到更新
可以大致对应下面将要提到的"主要模块介绍" :
ModelSerializer是怎么处理Model的关联字段的。在序列化和反序列化及校验方面。
这得查看rest_framework的serializers模块的ModelSerializer对象的源码了。
???? 首先,我们都知道plain Serializer对象,在序列化plain python object的时候,就是循环其属性,然后将属性名字和plain Serializer对象名字相同的,进行对应的序列化与反序列化逻辑。
???? 次前提, 知道在Serializer类定义时,是可以对一个field定义子字段的。WTF! 字段这么还有子字段嵌套这种概念啊!这是怎么回事呢?其实就是外层一个字段是一个序列化类,用于序列化这个字段对应的对象。
???? 然而, 对于Model Serializer对象,其实序列化时,遍历的是model object对象的字段属性,对应model object的plain field就根据一个映射字典,找到对应的plian serializer field就可以了。而对应model object的 one-to-one / many-to-many / foreignkey 字段,都归为 serializer的 PrimaryKeyRelateField了。由于one-to-one 和 foreignkey都是有实际字段,字段序列化后都是一个值;而many-to-many是多对多,虚拟化后的字段就是要包含多个值的,所以一般序列化后都是一个字典。所以在使用PrimaryKeyRelateField参数many要设置为True.代表该字段是一个多对多字段。这是要校验和序列化就需要看作是复合字段的方式,就是对于复合数据中的,单个元素看作一个子字段进行序列化和校验了(指定子字段就是使用child参数在父field实例化参数中)。关于多对多字段的PrimaryKeyRelateField会被显示强制转换为包含child字段的ManyRelateField字段。源码中文档英文说明:
也就是说,ManyRelatedField在序列化时,会迭代出对象,然后再将对象使用child原始序列化对象进行序列化。
???? 最后,源码类关系比较复杂,设计Field,BaseSerializer,Serializer,ModelSerializer和他们其中的方法。注意方法调用的是哪个类中的。
再次强点rest_framework的序列化类可以说是非常非常重要。对于每一个字段类型,可以大致分为两类: readable_fields 和 writable_fields 即 可序列化和可反序列化,当然有些字段是可以序列化也可以反序列化的。每一个field字段,的readable与writable是根据
原文:https://www.cnblogs.com/ZJiQi/p/10518213.html