JavaRush /Курси /Модуль 4: FastAPI /Створення Pydantic-моделей для валідації даних

Створення Pydantic-моделей для валідації даних

Модуль 4: FastAPI
Рівень 3 , Лекція 1
Відкрита

Тепер ми готуємось рухатися далі й навчимось створювати 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 для:

  1. Валідації даних у запитах (наприклад, обробляючи API-ендпоінт у FastAPI).
  2. Валідації даних перед збереженням їх у базі даних.
  3. Генерації документації для твого API (дякуємо інтеграції з FastAPI).

У наступній лекції ми подивимось, як вбудовувати ці моделі в ендпоінти FastAPI. А поки — спробуй створити власну модель і поекспериментувати з обробкою даних. Побачиш, наскільки це зручно.

Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ