Loading

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)
 

posted @ 2022-10-08 16:09  木子七  阅读(61)  评论(0编辑  收藏  举报