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.

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