В DRF, Как внедрить полный `ErrorDetail` в ответ, используя пользовательский обработчик исключений?

Я использую довольно сложный пользовательский обработчик в DRF. Например, для данного ответа response.data может выглядеть следующим образом:

{'global_error': None, 'non_field_errors': [], 'field_errors': {'important_field': [ErrorDetail(string='Ce champ est obligatoire.', code='required')]}}

Однако при получении фактического ответа от API, ErrorDetail будет преобразован в простую строку, потеряв информацию о коде.

Существует ли простой способ обеспечить, чтобы ErrorDetail всегда записывался в ответ как {"message": "...", "code": "..."}, не преобразуя ответ вручную в пользовательском обработчике?

Я знаю, что существует метод DRF get_full_details(), который возвращает именно это при исключении. Но я нахожусь на уровне ответа.

Не знаю, используете ли вы его, но вы могли бы использовать custom_exception_handler для преобразования всех возникающих исключений в формат, который вы предоставляете. Вот пример:

def custom_exception_handler(exc, context):
   response = exception_handler(exc, context)
   if response is not None:
      response.data["timestamp"] = datetime.now().isoformat()
      response.data["error_type"] = exc.__class__.__name__
      response.data["path"] = context["request"].path

   return response

Используя его, вот что получилось:

 {
  "detail": "Authentication credentials were not provided.",
  "timestamp": "2024-03-29T20:09:02.228370",
  "error_type": "NotAuthenticated",
  "path": "/tools/"
}

P.S.: Он также может принимать детализацию за исключение, возникающее из validate в сериализаторах.

Вот документация: custom_execption_handler

Вернуться на верх