1. 程式人生 > 其它 >序列化器中鉤子函式原始碼分析、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產生的物件的類分別是誰

# 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...]  # 列表套多個自定義序列化器類產生的物件