Вы можете переопределить обработчик исключений DRF по умолчанию и анализатор JSON на вашем settings.py
:
REST_FRAMEWORK = {
...
'EXCEPTION_HANDLER': 'helpers.exceptions.custom_exception_handler',
'DEFAULT_RENDERER_CLASSES': [
'helpers.renderers.JSONRenderer',
'rest_framework.renderers.BrowsableAPIRenderer',
]
}
И тогда это всего лишь вопрос настройки того, как обрабатывать ваши исключения и как отображать ответы:
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)
# Customize your exception handling here
return response
И вы можете использовать пользовательский рендерер JSON на тот случай, если вам нужно будет выполнить дополнительное форматирование ответа, в моем случае мне нужно было добавить «status_code» к полезной нагрузке:
class JSONRenderer(BaseJsonRenderer):
def render(self, data, accepted_media_type=None, renderer_context=None):
"""
Render `data` into JSON, returning a bytestring.
"""
<Base code from the original class...>
response = renderer_context.get('response')
if response and 200 <= response.status_code <= 299 and 'status_code' not in response.data:
response.data = Errors.success(response.data)
<Base code from the original class...>
Мой Errors.success(response.data)
был просто более простым способом объединения кода состояния успеха с данными.