В Pydantic 2 используйте field_validator: имя проверяйте полным совпадением [A-Za-z]+, а у валидированного email сравнивайте домен с gmail.com.
Создание кастомных проверок полей модели пользователя
В Pydantic 2 используйте field_validator: имя проверяйте полным совпадением [A-Za-z]+, а у валидированного email сравнивайте домен с gmail.com.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Дана модель, описанная с помощью Pydantic. Необходимо добавить пользовательские валидаторы:
- поле name должно содержать только латинские буквы, без цифр и спецсимволов;
- поле email обязано принадлежать домену gmail.com. Для реализации используйте встроенные механизмы Pydantic (например, декоратор @validator). Исходный класс выглядит следующим образом:
class User(BaseModel):
id: int
name: str = Field(min_length=3, max_length=32)
email: EmailStr
age: int = Field(ge=0, le=100)
is_active: bool
После добавления валидаторов модель будет отбрасывать некорректные значения согласно указанным правилам.
Ответ
В Pydantic 2 используйте field_validator: имя проверяйте полным совпадением [A-Za-z]+, а у валидированного email сравнивайте домен с gmail.com.
import re
from pydantic import BaseModel, Field, EmailStr, field_validator
class User(BaseModel):
id: int
name: str = Field(min_length=3, max_length=32)
email: EmailStr
age: int = Field(ge=0, le=100)
is_active: bool
@field_validator('name')
@classmethod
def latin_name(cls, value):
if not re.fullmatch(r'[A-Za-z]+', value):
raise ValueError('Используйте только латинские буквы')
return value
@field_validator('email')
@classmethod
def gmail_only(cls, value):
if value.rsplit('@', 1)[1].lower() != 'gmail.com':
raise ValueError('Требуется адрес gmail.com')
return value
EmailStr требует установленной зависимости email-validator. isalpha() недостаточно: он допускает кириллицу и другие алфавиты. Для Pydantic 1 используется прежний @validator; не смешивайте контракты двух версий.
Источник: pydantic.dev.