序列化器中鉤子函式原始碼分析、many關鍵字原始碼分析
阿新 • • 發佈:2022-03-31
區域性鉤子和全域性鉤子原始碼分析(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...] # 列表套多個自定義序列化器類產生的物件