Вопрос проверяет знание возможностей валидации данных в Pydantic, что необходимо для создания надежных и безопасных API-эндпоинтов.
Pydantic — это библиотека для валидации данных и управления настройками в Python, которая широко используется в веб-фреймворках, таких как FastAPI. Её основная сила заключается в использовании аннотаций типов Python для определения структуры данных и автоматической проверки входящей информации.
Вы можете использовать стандартные типы Python и специальные типы из Pydantic для описания полей модели.
int, str, float, bool, list, dict, Optional, Union.EmailStr, HttpUrl, PastDate, FutureDate, conint (ограниченное целое), constr (ограниченная строка).Функция Field позволяет задавать дополнительные метаданные и ограничения для поля.
from pydantic import BaseModel, Field, validator
class User(BaseModel):
name: str = Field(..., min_length=1, max_length=50)
age: int = Field(ge=0, le=120, description="Возраст пользователя")
email: str = Field(regex=r"^[\w\.-]+@[\w\.-]+\.\w+$")
score: float = Field(default=0.0, gt=0)
В этом примере: поле name обязательное (многоточие) и имеет ограничения по длине; age должно быть между 0 и 120; email проверяется регулярным выражением; score имеет значение по умолчанию и должно быть больше 0.
Для сложной логики можно создать собственный валидатор с помощью декоратора @validator.
from pydantic import BaseModel, validator
class Product(BaseModel):
name: str
price: float
discount_price: float
@validator('discount_price')
def check_discount(cls, v, values):
if 'price' in values and v >= values['price']:
raise ValueError('Скидочная цена должна быть меньше обычной')
return v
Этот валидатор проверяет, что цена со скидкой меньше обычной цены. Параметр values содержит уже проверенные значения других полей.
Декоратор @root_validator позволяет проверять взаимосвязи между несколькими полями после их валидации.
from pydantic import BaseModel, root_validator
class Order(BaseModel):
items: list[str]
total: float
@root_validator
def check_total_positive(cls, values):
if values.get('total', 0) <= 0:
raise ValueError('Итоговая сумма должна быть положительной')
return values
Такой подход полезен, когда правило зависит от комбинации полей.
Вывод: Pydantic предоставляет мощный и гибкий инструментарий для валидации данных, от простых проверок типов до сложной бизнес-логики. Его стоит применять везде, где требуется гарантировать корректность входящих данных, особенно при разработке API, обработке конфигураций или работе с внешними источниками данных.
Уровень
Рейтинг:
4
Сложность:
5
Навыки
Python
FastAPI
Ключевые слова
Подпишись на Python Developer в телеграм