在序列多个数据时,我们需要指定一个关键字many=True
image

这是为什么呢?

其实是,当序列化器产生对象时,传入参数many和不传入会生成两个不同的对象!!

这是怎么实现的呢??

1.类的对象生成–先调用类的__new__方法生成一个空对象
2.对象 = 类名(name=‘lz’)–会触发类的__init__方法,产生一个有属性的对象
3.类的__new__方法是控制对象生成

所以,找BookSerializer类的__new__方法,该类没有就往它的父类找,最后在BaseSerializer这个类中找到了__new__方法!!

    def __new__(cls, *args, **kwargs):
        if kwargs.pop('many', False):
            # 当 传入many=True 执行类的many_init方法
            return cls.many_init(*args, **kwargs)
        # 当未传入时,正常生成我们定义的序列化器类
        return super().__new__(cls, *args, **kwargs)

many_init该方法意思是单次生成多个我们自己定义的BookSerializer对象,然后添加到列表中!!


    @classmethod
    def many_init(cls, *args, **kwargs):
        allow_empty = kwargs.pop('allow_empty', None)
        max_length = kwargs.pop('max_length', None)
        min_length = kwargs.pop('min_length', None)
        child_serializer = cls(*args, **kwargs)
        list_kwargs = {
            'child': child_serializer,
        }
        if allow_empty is not None:
            list_kwargs['allow_empty'] = allow_empty
        if max_length is not None:
            list_kwargs['max_length'] = max_length
        if min_length is not None:
            list_kwargs['min_length'] = min_length
        list_kwargs.update({
            key: value for key, value in kwargs.items()
            if key in LIST_SERIALIZER_KWARGS
        })
        meta = getattr(cls, 'Meta', None)
        list_serializer_class = getattr(meta, 'list_serializer_class', ListSerializer)
        return list_serializer_class(*args, **list_kwargs)

原文地址:http://www.cnblogs.com/suncolor/p/16799324.html

1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长! 2. 分享目的仅供大家学习和交流,请务用于商业用途! 3. 如果你也有好源码或者教程,可以到用户中心发布,分享有积分奖励和额外收入! 4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解! 5. 如有链接无法下载、失效或广告,请联系管理员处理! 6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需! 7. 如遇到加密压缩包,默认解压密码为"gltf",如遇到无法解压的请联系管理员! 8. 因为资源和程序源码均为可复制品,所以不支持任何理由的退款兑现,请斟酌后支付下载 声明:如果标题没有注明"已测试"或者"测试可用"等字样的资源源码均未经过站长测试.特别注意没有标注的源码不保证任何可用性