Проверки значений¶
validators=[...] поля проверяют каждое записываемое в него значение до того, как оно попадёт в базу:
проверки hare.fields.validators, собственные проверки PostgreSQL, ваш подкласс Validator или обычная
функция.
Базовый класс:
class Validator(metaclass=abc.ABCMeta):
def __init__(self, message: str | None = None) -> None: ...
@abc.abstractmethod
def __call__(self, value: Any) -> None:
"""При ошибке бросает ValidationError."""
message заменяет собственный текст ошибки проверки; подкласс сообщает об ошибке через
self._raise(default_message), и тот берёт message, если он передан.
Подойдёт и обычная функция — наследовать Validator не обязательно. Список validators=[...] у поля
принимает и то, и другое:
def validate_even(value: int) -> None:
if value % 2 != 0:
raise ValidationError("must be even")
fields.IntField(validators=[validate_even])
Встроенные проверки¶
Все они последним аргументом принимают message: str | None = None — ваш текст ошибки вместо
стандартного:
| Проверка | Конструктор | Что проверяет |
|---|---|---|
RegexValidator |
(pattern: str, flags: int | re.RegexFlag, message=None) |
совпадение с регулярным выражением через re.match |
MaxLengthValidator |
(max_length: int, message=None) |
ошибка, если len(value) > max_length; значение — строка, список, кортеж или байты |
MinLengthValidator |
(min_length: int, message=None) |
ошибка, если len(value) < min_length |
MinValueValidator |
(min_value: int | float | Decimal, message=None) |
значение не меньше min_value |
MaxValueValidator |
(max_value: int | float | Decimal, message=None) |
значение не больше max_value |
MaxDigitsValidator |
(max_digits: int, decimal_places: int, message=None) |
Число значащих цифр Decimal с учётом decimal_places. message заменяет текст всех трёх его проверок (слишком много цифр всего, после запятой, до запятой) одним и тем же — отдельно для каждой проверки текст не задаётся. |
CommaSeparatedIntegerListValidator |
(allow_negative: bool = False, message=None) |
список целых чисел через запятую |
DomainNameValidator |
(accept_idna: bool = True, message=None) |
доменное имя по RFC 1034/1123; бросает InvalidDomainName. Готовый объект: validate_domain_name. |
URLValidator |
(allowed_schemes: list[str] | None = None, message=None) |
адрес URL; схемы по умолчанию ["http","https","ftp","ftps"]; бросает InvalidURL/InvalidScheme. Готовый объект: validate_url. |
EmailValidator |
(allowed_domains: list[str] | None = None, message=None) |
адрес электронной почты; бросает InvalidEmailAddress. Готовый объект: validate_email. |
IPv4Validator |
(message=None) |
адрес IPv4. Готовый объект: validate_ipv4_address. |
IPv6Validator |
(message=None) |
адрес IPv6. Готовый объект: validate_ipv6_address. |
IPv46Validator |
(message=None) |
Пробует IPv4, затем IPv6. Готовый объект: validate_ipv46_address. |
SlugValidator |
(allow_unicode: bool = False, message=None) |
латинские буквы, цифры, - и _; с allow_unicode — ещё любые буквы и цифры Юникода. Бросает InvalidSlug. Готовый объект: validate_slug. |
E164PhoneValidator |
(message=None) |
номер телефона в виде E.164: +, код страны не с 0, не больше 15 цифр (+16502530000). Бросает InvalidPhoneNumber. Готовый объект: validate_e164_phone. |
fields.CharField(max_length=254, validators=[validate_email])
fields.CharField(max_length=64, validators=[RegexValidator(r"^[a-z0-9_-]+$", 0)])
fields.IntField(validators=[MinValueValidator(0), MaxValueValidator(100)])
Проверки PostgreSQL для словарей и диапазонов (KeysValidator, RangeMinValueValidator,
RangeMaxValueValidator) находятся в hare.dialects.postgresql.validators — см. Проверки значений
PostgreSQL.
Своя проверка¶
class EvenValidator(Validator):
def __call__(self, value: Any) -> None:
if value % 2 != 0:
self._raise("must be even")
fields.IntField(validators=[EvenValidator()])
Если поле объявлено с null=True, а значение равно None, проверки не выполняются вовсе.
LengthValidator и NumericValidator — базовые классы проверок длины и значения: их
_validate_type(value) даёт ValidationError для значения, которое не строка, список, кортеж или bytes
— или не число (int, float, Decimal), — ещё до самой проверки.