many=True
__init__ => 一路找到 BaseSerializer => __new__决定了生成的对象是谁
# 源码 def__new__(cls,*args,**kwargs):# We override this method in order to automatically create# `ListSerializer` classes instead when `many=True` is set.# 传入的参数是many=True,执行cls.many_init(*args, **kwargs)if kwargs.pop('many',False):return cls.many_init(*args,**kwargs)# rest_framework.serializers.ListSerializer returnsuper().__new__(cls,*args,**kwargs)# app01.serializer.BookSerializer
7. 局部全局钩子源码解析
# 局部全局钩子源码解析
入口是is_valid()=> BaseSerializer => is_valid
=> self._validated_data
=> self.run_validation(self.initial_data)=> Serializer这个类的:self.run_validation
# 重写父类Field的run_validation方法classSerializer(BaseSerializer, metaclass=SerializerMetaclass):......defrun_validation(self, data=empty):"""
We override the default `run_validation`, because the validation
performed by validators and the `.validate()` method should
be coerced into an error dictionary with a 'non_fields_error' key.
"""# 验证空值(is_empty_value, data)= self.validate_empty_values(data)# 是空值返回dataif is_empty_value:return data
# 局部字段的校验和局部钩子校验 返回OrderedDict()实例化对象
value = self.to_internal_value(data)try:# 运行验证器
self.run_validators(value)# 全局钩子的校验
value = self.validate(value)"""
这里的全局钩子如果我们需要使用的时候,需要重写,重写的时候一定要返回被拿出来验证的属性
def validate(self, attrs):
return attrs
"""except(ValidationError, DjangoValidationError)as exc:raise ValidationError(detail=as_serializer_error(exc))return value