Преобразование Validationerror в сериализаторы. Validationerror в Django rest framework - PullRequest
1 голос
/ 09 мая 2020

У меня следующая проблема. У меня есть проверка на уровне модели, которая проверяет согласованность данных при каждом сохранении. В сериализаторах, если эта проверка уровня модели работает, она производит server error 500 с обратной трассировкой, тогда как serializer.Validationerror в сериализаторе создает красивую и чистую 400 error с сообщением об ошибке в json.

Для того, чтобы преобразовать уровень модели Validationerror в serializers. Validationerror Я использую следующий код в своих сериализаторах.

def perform_create(self, validated_data):
    try:
        return super().perform_create(validated_data)
    except exceptions.ValidationError as err:
        raise serializers.ValidationError(
            f'Model level validation assertion -- {str(err)}'
        ) from err

Он работает, но я не могу и не хочу переопределять каждый сериализатор для преобразования Validationerror to serializers. Validationerror.

Вопрос в том, есть ли способ поймать все Validationerror и преобразовать их в сериализаторы. Ошибки валидации?

1 Ответ

1 голос
/ 09 мая 2020
from rest_framework.views import exception_handler
from rest_framework.response import Response as DRF_response
from rest_framework import status

from django.core import exceptions
from django.views import View
from django.http import response


def custom_exception_handler(exc: Exception, context: View) -> [response, None]:

    response = exception_handler(exc, context)

    if isinstance(exc, exceptions.ValidationError):
        data = exc.message_dict
        return DRF_response(data=data, status=status.HTTP_400_BAD_REQUEST, )

    return response

Я сделал специальный обработчик ошибок, который ловит все Django стандартные ошибки проверки и возвращает на них ответ в стиле DRF.

...