Django rest framework Django REST Framework ValidationError始终返回400

Django rest framework Django REST Framework ValidationError始终返回400,django-rest-framework,http-status-codes,serialization,Django Rest Framework,Http Status Codes,Serialization,我试图强制ValidationError返回与400不同的状态代码。这就是我所做的: class MyValidationError(ValidationError): status_code = HTTP_403_FORBIDDEN 然后在序列化程序中: def validate_field(self, value): raise MyValidationError 为什么我这里的分数是400而不是403?有趣的是,如果我将PermissionDenied与自定义状态代码(

我试图强制
ValidationError
返回与400不同的状态代码。这就是我所做的:

class MyValidationError(ValidationError):
    status_code = HTTP_403_FORBIDDEN
然后在序列化程序中:

def validate_field(self, value):
    raise MyValidationError

为什么我这里的分数是400而不是403?有趣的是,如果我将
PermissionDenied
与自定义状态代码(我尝试了204)一起使用,而不是
ValidationError
,它将按预期工作。

Django RestFramework序列化程序验证所有可能的字段,并最终返回一组错误。

也就是说,假设您期望序列化程序中出现两个验证错误,其中一个验证错误是由
MyValidationError
引发的。在这种情况下,DRF显然会返回
HTTP400
状态代码,因为DRF的设计模式不会引发个体验证错误。

序列化程序验证过程在方法内部完成,并在方法末尾引发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)

为什么PermissionId返回自定义状态代码?

在方法中,只捕获
验证错误
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 = {}
如果不是hasattr(自我验证数据):
尝试:
self.\u验证的\u数据=self.run\u验证(self.initial\u数据)
除验证错误作为exc外:
自我验证数据={}
自身错误=exc.detail
其他:
self.\u errors={}
此时,DRF直接引发一个
PermissionDenaid
异常,并返回自己的状态代码,该代码由您自定义


结论 DRF Serializer ValidationError从不返回HTTP 400
以外的状态代码,因为它捕获了其他子验证错误异常(如果有),并且最后引发了一个主要的
ValidationError
,该错误通过其设计模式返回
HTTP 400
状态代码

参考


yo bruh只需创建自己的异常类并在序列化程序中重新运行它

类验证错误422(APIException):
status_code=status.HTTP_422_不可处理_实体
类BusinessSerializer(serializers.ModelSerializer):
类元:
模型=业务
字段=('id','name')
def有效(自身,raise_异常=False):
尝试:
返回超级(BusinessSerializer,self)。是否有效(引发异常)
除ValidationError为e外:
raise ValidationError422(细节=e.detail)
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 = {}