源码分析之序列化器的many关键字
在序列多个数据时,我们需要指定一个关键字many=True
这是为什么呢?
其实是,当序列化器产生对象时,传入参数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)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了