编程语言
首页 > 编程语言> > 序列化器中钩子函数源码分析、many关键字源码分析

序列化器中钩子函数源码分析、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...]  # 列表套多个自定义序列化器类产生的对象

标签:__,many,self,value,field,源码,钩子,validate,序列化
来源: https://www.cnblogs.com/zonghan/p/16083763.html