Django Rest Framework 中的验证码和消息

Validation codes and messages in Django Rest Framework

在序列化程序中使用开箱即用的字段,验证错误消息如下所示:

{
    "product": [
        "This field must be unique."
    ],
    "price": [
        "This field is required."
    ]
}

但是,对于我正在编写的 API,我想为每个失败的验证提供一个唯一的错误代码,以便客户端可以以编程方式响应验证错误,或者可以在一个UI。理想情况下,错误 json 看起来像这样:

{
    "product": [
        {
          "code": "unique",
          "message": "This field must be unique."
        }
    ],
    "price": [
        { 
          "code": "required",
          "message": "This field is required."
        }
    ]
}

当前使用 ValidationErrors 的方法使这变得相当困难。查看代码,目前似乎不支持这种类型的错误报告。但是,我正在寻找一种方法来覆盖错误处理以适合此模型。

将类似这样的内容添加到您的序列化程序中:

def is_valid(self, raise_exception=False):
    try:
        return super(ClientSerializer, self).is_valid(raise_exception)
    except exceptions.ValidationError as e:
        if 'email' in e.detail:
            for i in range(len(e.detail['email'])):
                if e.detail['email'][i] == UniqueValidator.message:
                    e.detail['email'][i] = {'code': 'not-unique'}
        raise e

这个问题很久以前就发布了,所以我会在这里添加更新的答案。较新版本的 DRF 现在支持此功能,但仍需要一些自定义代码。使用技巧创建一个新的异常处理程序:

from rest_framework.views import exception_handler
from rest_framework.exceptions import APIException


def full_details_exception_handler(exc, context):
    """
    This overrides the default exception handler to
    include the human-readable message AND the error code
    so that clients can respond programmatically.
    """
    if isinstance(exc, APIException):
        exc.detail = exc.get_full_details()

    return exception_handler(exc, context)

然后配置 DRF 以在您的设置中使用该自定义处理程序:

REST_FRAMEWORK['EXCEPTION_HANDLER'] = 'my_module.full_details_exception_handler'

如果此配置在 DRF 本身中可用,只需将其添加为配置选项就好了,但这是包含错误代码的非常轻量级的解决方案。