Django Rest Framework Пользовательский формат ошибок
Привет, у меня есть следующий dict, который необходимо сериализовать
{
"field_name":"myrole",
"description":"it has access",
"status":"active",
"role":"admin",
"modules":[
{
"module_id":"newid",
"create":true,
"read":true,
"update":true,
"delete":true
}
]
}
Сериализатор у меня сейчас такой
.class ModulerSerializer(serializers.Serializer):
module_id = serializers.BooleanField(required=True, allow_null=True)
delete = serializers.BooleanField(required=True)
read = serializers.IntegerField(required=True)
create = serializers.BooleanField(required=True)
update = serializers.BooleanField(required=True)
class RoleValidateSerializer(serializers.Serializer):
field_name = serializers.BooleanField(required=True)
description = serializers.CharField(required=True, max_length=128)
role = serializers.CharField(required=True, max_length=128)
status = serializers.CharField(required=True, max_length=128)
modules = serializers.ListField(child=ModulerSerializer())
он выдает сообщение об ошибке, как показано ниже
{'field_name': [ErrorDetail(string='Must be a valid boolean.', code='invalid')],
'modules': {
0: {'module_id': [ErrorDetail(string='Must be a valid boolean.', code='invalid')],
'read': [ErrorDetail(string='A valid integer is required.', code='invalid')]}}}
Я ожидаю добавления всех значений сообщений об ошибках в один массив, как показано ниже, или извлечения сообщения об ошибке из всех вложенных дочерних объектов
[field_name Must be a valid boolean,module_id Must be a valid boolean, read A valid integer is required. ]
Вариант - определить свой собственный обработчик исключений, который будет использоваться при любом вызове веб-сервиса: создайте файл python (например, handle_exceptions.py
) в вашем django-приложении, пусть app
, и поместите в него логику.
Например:
app/handle_exceptions.py
import copy
from rest_framework.exceptions import ValidationError
def my_exception_handler(exc, context):
response = exception_handler(exc, context)
if response is not None:
try:
if isinstance(exc, ValidationError):
custom_errors = []
errors = copy.deepcopy(response.data)
for field, message in errors.items():
if isinstance(message, dict):
# process message
# error_message = '...'
elif isinstance(message, list):
# process message
# error_message = '...'
elif isinstance(message, str):
# process message
# error_message = '...'
custom_errors.append(error_message)
response.data = custom_errors
except Exception as ex:
print(str(ex))
return response
Для получения строкового представления ErrorDetail(string='Must be a valid boolean.', code='invalid')
попробуйте str(ErrorDetail(string='Must be a valid boolean.', code='invalid'))
.
Затем перейдите в настройки вашего проекта и измените модуль EXCEPTION_HANDLER фреймворка django rest следующим образом:
settings.py
REST_FRAMEWORK = {
...
'EXCEPTION_HANDLER': 'app.handle_exceptions.my_exception_handler'
# 'EXCEPTION_HANDLER':'rest_framework.views.exception_handler',
}
Данное решение требует использования пакета django rest framework.