почему мы используем валидаторы?
- Валидаторы используются для проверки данных, являются ли они семантически достоверными или нет.
- Валидация упрощает обработку данных
- Проверка позволяет избежать избыточности данных
Пользовательская проверка для полей сериализатора
Django REST поддерживает как сериализаторы, так и сериализаторы моделей. Сериализаторы обеспечивают базовую проверку полей. В некоторых случаях нам нужно написать настраиваемые проверки для полей.
Возьмем пример проверки для полей сериализатора.
Кейс: компании нужен набор на должность «разработчика django». Компания установила возрастное ограничение для заявителя: его возраст должен быть от двадцати до тридцати лет.
Способ 1:
from datetime import date from rest_framework import serializers def age_restriction(dob): today = date.today() age = today.year - dob.year - ((today.month, today.day) < (dob.month, dob.day)) if (not(20 < age < 30)): raise serializers.ValidationError("You are no eligible for the job") return dob class EligibilitySerializer(serializers.Serializer): email = serializers.EmailField() name = serializers.CharField(max_length=200) date_of_birth = serializers.DateField(validators=[age_restriction])
serializers.Serializer применяет первичные проверки к полю, когда мы вызываем метод is_valid. Сериализатор преобразует значение поля в объект Python. После того, как он проверит атрибут «validate_ ‹field_name›», если он имеет атрибут, он будет атрибутом (методом). После этой проверки он проверит наличие атрибута «валидаторы» для поля. валидаторы - это объект списка. Итак, сериализатор берет каждый валидатор из списка валидаторов и применяет его к значению поля. После того, как он вызовет метод «validate» и выполнит инициализацию проверки.
«validate_ ‹field_name›» получает значение, относящееся к полю, но, если в качестве «validate» ” метод получает данные, связанные со всеми полями, и вызывает « ошибки, не связанные с полями »
. Если какая-либо из проверок [вышеупомянутых методов проверки] завершилась неудачно, то будет выдана ошибка проверки. в противном случае будет возвращено действительное значение.
Способ - 2:
from datetime import date from rest_framework import serializers class EligibilitySerializer(serializers.Serializer): email = serializers.EmailField() name = serializers.CharField(max_length=200) date_of_birth = serializers.DateField() def validate_date_of_birth(self, dob): today = date.today() age = today.year - dob.year - ((today.month, today.day) < (dob.month, dob.day)) if (not(20 < age < 30)): raise serializers.ValidationError("You are no eligible for the job") return dob
Протестируйте указанный выше сериализатор с действительными данными и недопустимыми данными
# testing with valid data data = { 'date_of_birth': '1993-04-08', 'email': '[email protected]', 'name': 'user' } s = EligibilitySerializer(data=data) print(s.is_valid()) # Output: True print(s.data) # Output: ReturnDict([('email', '[email protected]'), # ('name', 'user'), # ('date_of_birth', '1993-14-08')]) # testing with invalid data data = { 'date_of_birth': '1980-04-08', 'email': '[email protected]', 'name': 'user' } print(s.is_valid()) # Output: False print(s.errors) # Output: ReturnDict([('date_of_birth', ['You are no eligible for the job'])])
когда использовать «validate_ ‹field_name›» и «валидаторы» для полей?
- Если мы применяем один валидатор к данным поля, мы должны использовать «validate_ ‹field_name›».
- Если мы применяем более одного валидатора, мы должны использовать «валидаторы».