Django RestFramework 序列化程序验证所有可能的字段并最终返回错误集。
也就是说,假设您期望序列化程序中有两个验证错误,其中一个验证错误是由MyValidationError 引发的。在那种情况下,DRF 显然会返回 HTTP 400 状态码,因为 DRF 的 设计模式 不会引发 individual 验证错误。
序列化验证过程在is_valid() 方法内部完成,并在方法结束时引发 ValidationError。
def is_valid(self, raise_exception=False):
....code
....code
if self._errors and raise_exception:
raise ValidationError(self.errors)
return not bool(self._errors)
ValidationError 类引发 HTTP 400
class ValidationError(APIException):
status_code = status.HTTP_400_BAD_REQUEST
default_detail = _('Invalid input.')
default_code = 'invalid'
.... code
为什么 PermissionDenaid 返回自定义状态码?
在is_valid() (source code) 方法中,它只捕获ValidationError
if not hasattr(self, '_validated_data'):
try:
self._validated_data = self.run_validation(self.initial_data)
except ValidationError as exc:
self._validated_data = {}
self._errors = exc.detail
else:
self._errors = {}
到时候DRF直接抛出
PermissionDenaid异常,返回自己的状态码,由你自定义
结论
DRF Serializer ValidationError 永远不会返回除HTTP 400 之外的状态代码,因为它捕获其他子验证错误异常(如果有)并且最后提出了一个主要的ValidationError,它通过它的设计模式返回HTTP 400状态码
参考:
is_valid() source code
ValidationError class source code