drf中listreializer源码

开始进行listserializer源码分析

从ModelSerializer开始

ModelSerializer没有__init__方法,我们去寻找他的父类(Serialzer)也没有__init__方法,我们再去找爷爷类

(BaseSerializer),BaseSerializer类不仅有__init__方法也有__new__方法

补充:在实例化对象时,先走new方法,再走init方法

BaseSerializer.__new__方法

img

我们在进行群增,群改都会在实例化对象的括号内加上many=True

在这的cls就是我们写的序列化类

假设我们写了many=True,会通过if判断,直接走cls.many_init

进入many_init方法

img

这里的child_serializer会重新走一遍实例化,但这次实例化,kwargs中已经没有many了,并不会走many_init,而是直接正常实例化,这就能应证我们在listserializer中能直接使用self.child直接拿到我们写的序列化类

这里的meta也是我们序列化类中的定义的子类,我们通过反射拿到我们自定义的listserializer,在我自定义的listserializer中重写了update方法,并继承listserializer,所以我们只是重写了listserializer类中的update方法

从最后一步return能看出,我们序列化类实例化时,如果有many=True,实际上是listserializer类的实例化

源码的博客是真的难写,别喷

猜你喜欢

转载自www.cnblogs.com/asdaa/p/11695292.html