# 校验字段
ser = self.get_serializer(data=request.data) "这里的requesst.data是一个字典"
ser.is_valid(raise_exception=True) "执行BaseSerilazer里面的is_valid"
""
BaseSerializer
""
def is_valid(self, *, raise_exception=False):
assert hasattr(self, 'initial_data'), (
'Cannot call `.is_valid()` as no `data=` keyword argument was '
'passed when instantiating the serializer instance.'
)
if not hasattr(self, '_validated_data'):
try:
self._validated_data = self.run_validation(self.initial_data) "执行子类Serializer的run_validation,经过这个方法后返回的数据变成了有序字典, "
except ValidationError as exc:
self._validated_data = {}
self._errors = exc.detail
else:
self._errors = {}
if self._errors and raise_exception:
raise ValidationError(self.errors)
return not bool(self._errors)
""
Serializer
""
def run_validation(self, data=empty):
(is_empty_value, data) = self.validate_empty_values(data)
if is_empty_value:
return data
value = self.to_internal_value(data) "这里的方法将字典变成有序字典"
try:
self.run_validators(value)
value = self.validate(value) "这里执行自定义validate的校验"
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
""
BaseSeiralizer
""
def save(self,validate_data)
validated_data = {**self.validated_data, **kwargs} "这个地方又把有序字典转成字典,在未调用save方法之前,validate_data一直是个有序字典"
if self.instance is not None:
self.instance = self.update(self.instance, validated_data)
assert self.instance is not None, (
'`update()` did not return an object instance.'
)
else:
self.instance = self.create(validated_data)
assert self.instance is not None, (
'`create()` did not return an object instance.'
)
return self.instance
序列化校验方法里面的参数是如何变化
于 2023-10-30 15:06:02 首次发布