Django rest_framework 自定义错误信息

Clu*_*der 2 django django-rest-framework

我有一个 API 端点,它将使用 rest_framework 进行输入验证serializer.is_valid(),它将返回自定义错误消息和响应。

serializer = FormSerializer(data=data)
if not serializer.is_valid(raise_exception=False):
    return Response({"Failure": "Error"}, status=status.HTTP_400_BAD_REQUEST)
Run Code Online (Sandbox Code Playgroud)

是否可以在不使用raise_exception=True?提供的通用响应的情况下填充验证错误?我试图避免使用通用响应,因为如果存在多个错误,它将显示所有验证错误。

响应将类似于

return Response(
     {
          "Failure": "Error", 
          "Error_list": {"field1": "This field is required"}
     },
     status=status.HTTP_400_BAD_REQUEST
) 
Run Code Online (Sandbox Code Playgroud)

JPG*_*JPG 9

创建一个Custom Exception类,

from rest_framework.exceptions import PermissionDenied
from rest_framework import status


class MyCustomExcpetion(PermissionDenied):
    status_code = status.HTTP_400_BAD_REQUEST
    default_detail = "Custom Exception Message"
    default_code = 'invalid'

    def __init__(self, detail, status_code=None):
        self.detail = detail
        if status_code is not None:
            self.status_code = status_code
Run Code Online (Sandbox Code Playgroud)


为什么我是从PermissionDenied异常类继承来的??
看到这个 SO 帖子——为什么 DRFValidationError总是返回400

然后在你的序列化程序中,引发异常,

class SampleSerializer(serializers.ModelSerializer):
    class Meta:
        fields = '__all__'
        model = SampleModel

    def validate_age(self, age):  # field level validation
        if age > 10:
            raise MyCustomExcpetion(detail={"Failure": "error"}, status_code=status.HTTP_400_BAD_REQUEST)
        return age

    def validate(self, attrs): # object level validation
        if some_condition:
            raise MyCustomExcpetion(detail={"your": "exception", "some_other": "key"}, status_code=status.HTTP_410_GONE)
        return attrs
Run Code Online (Sandbox Code Playgroud)


age并且nameSampleModel类的 两个字段


响应将是这样的

在此处输入图片说明
通过这种方法,
1,您可以自定义JSON响应
2.你可以返回任何状态码
3.你并不需要传递Trueserializer.is_valid()方法(这是不reccomended)


nev*_*ner 2

您可以编写自定义错误处理程序

from rest_framework.views import exception_handler

def custom_exception_handler(exc, context):
    response = exception_handler(exc, context)
    if response is not None:
        response.data['Failure'] = 'Error'

    return response
Run Code Online (Sandbox Code Playgroud)