почему мы используем валидаторы?

  • Валидаторы используются для проверки данных, являются ли они семантически достоверными или нет.
  • Валидация упрощает обработку данных
  • Проверка позволяет избежать избыточности данных

Пользовательская проверка для полей сериализатора

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›».
  • Если мы применяем более одного валидатора, мы должны использовать «валидаторы».

Статья изначально была опубликована в блоге MicroPyramid.