Ограничение длины поля модели с ответом проверки в сериализаторе - PullRequest
0 голосов
/ 21 сентября 2018

Я проверяю данные из запроса в структуре отдыха django с проверкой данных в сериализаторе.Мне нужно, чтобы все сообщения об ошибках отправлялись в одном ответе.

При отправке слишком длинной строки я получаю сообщение об ошибке:

django.db.utils.DataError: value too long for type character varying(3)

В моей модели я определилмаксимальная длина символьного поля равна 3 (теоретически макс. необходимо).

Я добавил проверку в сериализаторе для перехвата запросов с слишком большим количеством символов:

validators.py

class CustomUserValidators():

    errors_to_return = {}
    def val_role(self, role):
            if len(role) > 3:
                self.errors_to_return["role_length"] = "Ensure this field has no more than 3 characters."

serializers.py

from Sea.validators import CustomUserValidators
class LagoonUserCreateSerializer(UserCreateSerializer, CustomUserValidators):
    class Meta:
        model = User
        fields = ('id', 'username', 'role',)


    def validate(self, attrs):
        self.val_role(attrs['role'])

        if len(self.errors_to_return) > 0:
            raise serializers.ValidationError(self.errors_to_return)

        return attrs

models.py

class SeaUser(AbstractUser):
    ...
    role = models.CharField(_('Role'), max_length=3)

Но запрос по-прежнему возвращает ошибку (value too long..., как указано выше).Я ожидал, что erorr будет обнаружен в сериализаторе, а значения не переданы в модель. Почему значение достигает модели?

Я исследовал это, и все решения говорятсделайте длину поля 255. Это не отвечает, почему значение когда-либо тестируется моделью, и не объясняет, что произошло, если в запросе окажется значение, превышающее ожидаемое.

Любая помощь с этим приветствуется.

1 Ответ

0 голосов
/ 21 сентября 2018

Я бы использовал другой подход и воспользовался бы преимуществами проверки сериализатора.

Вы можете указать пользовательскую проверку на уровне поля, добавив методы .validate_field к вашему сериализатору.

Таким образом, вы можете добавитьследующий метод к вашему сериализатору.

def validate_role(self, value):
    if len(value) > 3:
        raise serializers.ValidationError("Ensure this field has no more than 3 characters")
    return value

И полностью удалить CustomUserValidators.

Как уже упоминалось в комментарии, вы можете перенести проверку в служебную функцию и использовать ее везде, где вам нужно.

def validate_user_role(value):
    return 0 < len(value) <= 3

Вы можете разместить эту функцию в отдельном модуле, если хотите, и затем использовать ее в сериализаторе:

def validate_role(self, value):
    if not validate_user_role(value):
        raise serializers.ValidationError("Ensure this field has no more than 3 characters")
    return value

Другое, более простое решение - использование атрибутов сериализатора CharField.и сделайте это:

class LagoonUserCreateSerializer(UserCreateSerializer):
    role = serializers.CharField(min_length=1, max_length=3)

Это подтвердит ваш ввод без применения метода validate_role.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...