• drf中ListSerializer源码


    开始进行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类的实例化

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

  • 相关阅读:
    c# 正则表达式 首字母转大写
    c# WebBrowser获取cookie
    c# 求最小公倍数
    Response.Redirect与Server.Transfer区别-转
    asp 读文件 比较ip
    asp数组的使用
    如何解决#1045
    mysql limit分页查询效率
    Docker 容器管理:rancher
    Docker监控:google/cadvisor
  • 原文地址:https://www.cnblogs.com/asdaa/p/11695292.html
Copyright © 2020-2023  润新知