35.ListSerializer详解
- ListSerializer继承了BaseSerializer
- 一般情况下我们不直接使用ListSerializer
- ListSerializer会自动调用,序列化many=True的字段时,会自动调用ListSerializer
# baseSerializer中的调用实现逻辑
def __new__(cls, *args, **kwargs):
# 如果有many字段
if kwargs.pop('many', False):
# 调用类方法 many_init
return cls.many_init(*args, **kwargs)
# 没有many字段,执行父类的new,走正常序列化流程
return super().__new__(cls, *args, **kwargs)
@classmethod
def many_init(cls, *args, **kwargs):
allow_empty = kwargs.pop('allow_empty', None) #判断是否为空
child_serializer = cls(*args, **kwargs)
list_kwargs = { #列表参数
'child': child_serializer,
}
if allow_empty is not None: #如果为空
list_kwargs['allow_empty'] = allow_empty
list_kwargs.update({
key: value for key, value in kwargs.items()
if key in LIST_SERIALIZER_KWARGS
})
meta = getattr(cls, 'Meta', None)
# 在序列化的meta中找listSerializer
# 如果有自定义的ListSerializer则使用我们自定义
# 否则使用默认的ListSerializer
list_serializer_class = getattr(meta, 'list_serializer_class', ListSerializer)
# 执行ListSerializer
return list_serializer_class(*args, **list_kwargs)
风月都好看,人间也浪漫.