序列化器中钩子函数源码分析、many关键字源码分析

局部钩子和全局钩子源码分析(2星)

# 入口是 ser.is_valid(),是BaseSerializer的方法
# 最核心的代码
	self._validated_data = self.run_validation(self.initial_data) # 切记不要按住ctrl点
    
# run_validation 调用的是Serializer类的方法
    def run_validation(self, data=empty):
        value = self.to_internal_value(data) # 局部钩子的代码
        try:
            self.run_validators(value)
            value = self.validate(value)  # 全局钩子的执行
            assert value is not None, '.validate() should return the validated data'
        except (ValidationError, DjangoValidationError) as exc:
            raise ValidationError(detail=as_serializer_error(exc))

        return value
    
    
  # 局部钩子核心代码
        for field in fields:
            validate_method = getattr(self, 'validate_' + field.field_name, None) #反射字段的局部钩子方法
            try:
                if validate_method is not None:
                    validated_value = validate_method(validated_value) #执行局部钩子方法
            except ValidationError as exc:
                errors[field.field_name] = exc.detail
            except DjangoValidationError as exc:
                errors[field.field_name] = get_error_detail(exc)

源码分析之many关键字

首先我们看下加不加many产生的对象的类分别是谁

image

image

image

image

# 1  对象的实例化过程,__new__在__init__之前执行
# 2 序列化类在实例化的时候,先调用的是BaseSerializer中的__new__
 def __new__(cls, *args, **kwargs):
        if kwargs.pop('many', False):
            return cls.many_init(*args, **kwargs)  ##实例化出ListSerializer的对象
        return super().__new__(cls, *args, **kwargs) # 实例化出自己的对象
    
# 3 ListSerializer 和自定义的序列化器类有什么联系
自定义序列化器类产生的结果是一个ser对象
ListSerializer类产生的结果是[ser1,ser2,ser3...]  # 列表套多个自定义序列化器类产生的对象
posted @   zong涵  阅读(50)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
点击右上角即可分享
微信分享提示