使用Django Rest Framework自定义验证错误消息

xmjla07d  于 2023-06-25  发布在  Go
关注(0)|答案(3)|浏览(160)

DRF给出的默认验证错误消息是密钥和消息的列表。将此格式自定义为文本格式的最佳方法是什么?例如。
这是默认格式。

{
"message": {
    "phone": [
        "customer with this phone already exists."
    ],
    "email": [
        "customer with this email already exists."
    ],
    "tenant_id": [
        "customer with this tenant id already exists."
    ]
},
"success": false,
"error": 1
}

这是我想要的东西。

{
"message": "customer with this phone already exists, customer with this 
email already exists, customer with this tenant id already exists"
"success": false,
"error": 1
}
u3r8eeie

u3r8eeie1#

为了回答这个问题,我做了一个类似于重写djangorest framework默认异常处理程序的过程。

from rest_framework.views import exception_handler

def custom_exception_handler(exc, context):
    # Call REST framework's default exception handler first,
    # to get the standard error response.
    response = exception_handler(exc, context)

    # Now add the HTTP status code to the response.
    if response is not None:

        if isinstance(response.data, dict):
            for data_key, data_array in response.data.items():
                if not (isinstance(data_array, list) and len(data_array) < 2):
                    continue
                if hasattr(data_array[0], "title"):
                    response.data[data_key] = data_array[0].title()

        response.data["status_code"] = response.status_code
    return response

我认为这是一个原因,如果我是正确的,Django的休息使每个字段的错误列表(不确定)。我想也许有时一个字段可能碰巧有一个以上的错误,但我最终定制它,所以如果它只是一个字段的错误,你将有自定义,否则多个错误的列表。
最后,用点表示法将此函数的路径添加到settings.py(rest_framework settings context),如下所示

REST_FRAMEWORK = {
    'EXCEPTION_HANDLER': 'myapp.mymodule.custom_exception_handler'
}

在我的例子中,我在与设置相同的包目录中的模块中创建了函数。
例如:对于用户已经存在和电子邮件已经存在,你应该得到一个响应

{
    "email": "User With This Email Already Exists.",
    "phone": "User With This Phone Already Exists.",
    "status_code": 400
}

happy hacking:)

iqjalb3h

iqjalb3h2#

通常的做法是显示各个字段的验证消息,而不是提供单个常规消息。因此,DRF的默认行为遵循此约定。
要实现您想要的,您需要为您的序列化器www.example.com创建对象级验证http://www.django-rest-framework.org/api-guide/serializers/#object-level-validation,并防止字段验证的默认行为。

6l7fqoea

6l7fqoea3#

你可以根据你的表单在视图中修改你的错误,在你给予响应序列化器的时候。你可以把你自己的字典传递给

相关问题