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)
 

作者:木子七

出处:https://www.cnblogs.com/Mickey-7/p/16769268.html

posted @   木子七  阅读(78)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示
workspaces
keyboard_arrow_up dark_mode palette
选择主题