Получите краткое сообщение об ошибке от Django Rest Framework - PullRequest
1 голос
/ 14 июля 2020

У меня есть сериализатор, который выглядит так:

class CreatePostSerializer(serializers.ModelSerializer):
    user = serializers.PrimaryKeyRelatedField(
        read_only=True,
    )

    topics = serializers.ListField(
        child=serializers.CharField(
            max_length=50,
            error_messages={'max_length': 'Each tag should be no more than 50 characters.'}
        ),
        max_length=3,
        write_only=True,
        error_messages={'required': 'You need to add at least one tag to your question.'}
    )

    class Meta:
        model = Question
        fields = ('user', 'status', 'topics')

Когда я превышаю количество символов для max_length, я получаю сообщение об ошибке, однако оно появляется в такой форме:

{"themes": {"0": ["Каждый тег должен содержать не более 50 символов."]}}

Есть ли способ вернуть его? что-то вроде этого:

{"detail": {["Каждый тег не должен содержать более 50 символов."]}

1 Ответ

0 голосов
/ 14 июля 2020

Один из способов - написать свой собственный обработчик. В DRF для этого есть положение.

В вашем appsettings.py

REST_FRAMEWORK = {
.
.
    'EXCEPTION_HANDLER': 'my_app.path.to.my_exception_handler',
.
.
}

Теперь в обработчике исключений вы можете настроить его так, как вы хотите.

def my_exception_handler(exc, context):
    response = exception_handler(exc, context)

    if response is not None:
        data = response.data
        if response.status_code == 401:
            response.data['errors'] = 'Token is invalid or expired'
            response.data['status'] = response.status_code
            return response
        response.data = {}
        errors = []
        for field, value in data.items():
            errors.append("{} : {}".format(
                underscore_to_camelcase(field), " ".join(value)))

        response.data['errors'] = errors
        response.data['status'] = response.status_code

    return response

underscore_to_camelcase - это специальный метод для сериализации его в случай верблюда.

...