Тепер ми готуємось рухатися далі й навчимось створювати Pydantic-моделі для валідації даних. Не панікуй: з практикою і трішки фантазії ти зробиш це з закритими очима (але краще тримати їх відкритими, бо помилки в коді бачити простіше).
Якщо глянути на додатки, які ти писав раніше, погодься, валідація даних — це доволі серйозний виклик. Якщо перевіряти типи даних і умови вручну, це як збирати меблі з IKEA без інструкції. Ось тут на сцену виходить Pydantic. З його допомогою ти можеш:
- Спростити обробку даних.
- Уникнути "поганих" даних у запитах.
- Зробити своє API більш стійким (і вразити інтерв'юера на співбесіді).
1. Основи створення моделі: знайомство з BaseModel
В Pydantic будь-який набір даних починається з класу, який наслідується від pydantic.BaseModel. Чому ми наслідуємось від BaseModel? Це як купити зібраний конструктор: він сам усе перевірить, перетворить і поверне коректний набір даних.
Ось базовий приклад:
from pydantic import BaseModel
class User(BaseModel):
name: str
age: int
email: str
Тут ми визначили клас User з трьома полями:
name: рядок (обов'язково).age: ціле число (обов'язково).email: рядок (обов'язково).
Тепер ми можемо використовувати цю модель для валідації вхідних даних.
input_data = {
"name": "Іван",
"age": 30,
"email": "ivan@example.com"
}
user = User(**input_data)
print(user) # User(name='Іван', age=30, email='ivan@example.com')
Якщо дані не підходять за типом, Pydantic підкине зрозуміле виключення. Наприклад:
bad_data = {
"name": "Іван",
"age": "тридцять", # Ой, вік має бути числом
"email": "ivan@example.com"
}
user = User(**bad_data)
# ValidationError: value is not a valid integer
2. Додаткові можливості Pydantic: автоматичне перетворення
Pydantic — наче турботливий бариста. Якщо йому принесли напівготове замовлення, він спробує "довести". Наприклад, Pydantic може автоматично перетворювати типи даних. Це працює, якщо передані дані хоч би трохи схожі на потрібні.
data = {
"name": "Марія",
"age": "25", # Рядок, але виглядає як число
"email": "maria@example.com"
}
user = User(**data)
print(user)
# User(name='Марія', age=25, email='maria@example.com')
Однак це не означає, що можна розслабитись і засовувати будь-які дані! Якщо перетворення неможливе, помилка все одно спливе.
3. Поля моделі: як задати конкретні типи даних
Pydantic підтримує багато типів даних: від рядкових до складних колекцій. Ось невеликий довідник:
| Тип даних у Pydantic | Приклад використання |
|---|---|
str |
name: str |
int |
age: int |
float |
price: float |
bool |
is_active: bool |
datetime |
created_at: datetime |
list |
tags: list[str] |
dict |
metadata: dict[str, str] |
Трохи складніший приклад:
from pydantic import BaseModel
from datetime import datetime
class Product(BaseModel):
name: str
price: float
is_active: bool
tags: list[str]
created_at: datetime
data = {
"name": "Ноутбук",
"price": 799.99,
"is_active": True,
"tags": ["електроніка", "комп'ютери"],
"created_at": "2023-10-16T12:00:00"
}
product = Product(**data)
print(product)
# Product(name='Ноутбук', price=799.99, is_active=True, tags=['електроніка', "комп'ютери"], created_at=datetime.datetime(2023, 10, 16, 12, 0))
Зверни увагу на поле created_at: рядок ISO-8601 автоматично перетворився в datetime.
4. Приклад створення базової моделі: користувацький профіль
Давай крок за кроком створимо модель для валідації даних користувача. Вона включатиме такі поля:
username: рядок, обов'язкове поле.email: рядок, обов'язкове поле.bio: рядок, необов'язкове поле.birth_date: дата, необов'язкове поле.
Створюємо модель:
from pydantic import BaseModel
class UserProfile(BaseModel):
username: str
email: str
bio: str | None = None # Поле може бути необов'язковим
birth_date: datetime.date | None = None
Приклад використання:
data = {
"username": "super_coder",
"email": "coder@example.com",
"bio": "Люблю кодувати в Pydantic!",
"birth_date": "1990-05-13"
}
user = UserProfile(**data)
print(user)
# UserProfile(username='super_coder', email='coder@example.com', bio='Люблю кодувати в Pydantic!', birth_date=datetime.date(1990, 5, 13))
5. Обробка помилок: що відбувається при неправильних даних
Помилки в Pydantic — це окреме мистецтво. Ось що станеться, якщо передати некоректні дані:
broken_data = {
"username": "no_email_user",
"email": "неправильний_email"
}
user = UserProfile(**broken_data)
# ValidationError: value is not a valid email address
Великий плюс Pydantic у тому, що помилки завжди містять детальне пояснення проблеми.
6. Висновок: як застосовувати Pydantic-моделі у реальних проєктах?
Ти можеш використовувати Pydantic для:
- Валідації даних у запитах (наприклад, обробляючи API-ендпоінт у FastAPI).
- Валідації даних перед збереженням їх у базі даних.
- Генерації документації для твого API (дякуємо інтеграції з FastAPI).
У наступній лекції ми подивимось, як вбудовувати ці моделі в ендпоінти FastAPI. А поки — спробуй створити власну модель і поекспериментувати з обробкою даних. Побачиш, наскільки це зручно.
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ