源码分析之序列化器的many关键字

打印 上一主题 下一主题

主题 1744|帖子 1744|积分 5232

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

这是为什么呢?
其实是,当序列化器产生对象时,传入参数many和不传入会生成两个不同的对象!!
这是怎么实现的呢??
1.类的对象生成--先调用类的__new__方法生成一个空对象
2.对象 = 类名(name=‘lz’)--会触发类的__init__方法,产生一个有属性的对象
3.类的__new__方法是控制对象生成
所以,找BookSerializer类的__new__方法,该类没有就往它的父类找,最后在BaseSerializer这个类中找到了__new__方法!!
  1.     def __new__(cls, *args, **kwargs):
  2.         if kwargs.pop('many', False):
  3.             # 当 传入many=True 执行类的many_init方法
  4.             return cls.many_init(*args, **kwargs)
  5.         # 当未传入时,正常生成我们定义的序列化器类
  6.         return super().__new__(cls, *args, **kwargs)
复制代码
many_init该方法意思是单次生成多个我们自己定义的BookSerializer对象,然后添加到列表中!!
  1.     @classmethod
  2.     def many_init(cls, *args, **kwargs):
  3.         allow_empty = kwargs.pop('allow_empty', None)
  4.         max_length = kwargs.pop('max_length', None)
  5.         min_length = kwargs.pop('min_length', None)
  6.         child_serializer = cls(*args, **kwargs)
  7.         list_kwargs = {
  8.             'child': child_serializer,
  9.         }
  10.         if allow_empty is not None:
  11.             list_kwargs['allow_empty'] = allow_empty
  12.         if max_length is not None:
  13.             list_kwargs['max_length'] = max_length
  14.         if min_length is not None:
  15.             list_kwargs['min_length'] = min_length
  16.         list_kwargs.update({
  17.             key: value for key, value in kwargs.items()
  18.             if key in LIST_SERIALIZER_KWARGS
  19.         })
  20.         meta = getattr(cls, 'Meta', None)
  21.         list_serializer_class = getattr(meta, 'list_serializer_class', ListSerializer)
  22.         return list_serializer_class(*args, **list_kwargs)
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

半亩花草

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表