Перейти к основному контенту
Tech Path Finder
КурсыИнтервьюКод-ревьюБлог
Tech Path Finder

Персонализированный путеводитель в IT. Квизы, мок-интервью, код ревью и аналитика прогресса.

@potapov_me

Платформа

  • Курсы
  • Прогресс
  • Мок-интервью
  • Код ревью
  • Живое ревью с ИИ
  • Тренажёр переговоров
  • Закладки

Контент

  • Блог
  • Главная
  • Обратная связь

Компания

  • О проекте
  • Тарифы
  • Условия использования
  • Конфиденциальность
  • Согласие на обработку данных
  • Cookie
  • Реквизиты

Аккаунт

  • Войти
  • Зарегистрироваться
  • Профиль

© 2026 Tech Path Finder. Все права защищены.

·ИП Потапов К.С.·Политика конфиденциальности·
Сделано с ❤️ в России
  1. Сериализация: model_dump и model_dump_json
serialization_basics

Сериализация: model_dump и model_dump_json

Преобразование моделей в dict и JSON, режимы include/exclude, by_alias, exclude_none.

Сериализация: model_dump и model_dump_json

Сериализация — это искусство превращать модели в данные для передачи вовне

#Базовая сериализация

#model_dump(): преобразование в словарь

from pydantic import BaseModel from datetime import datetime class User(BaseModel): id: int name: str email: str created_at: datetime user = User( id=1, name="Alice", email="alice@example.com", created_at=datetime(2026, 3, 18, 10, 30) ) # Преобразование в dict data = user.model_dump() # {'id': 1, 'name': 'Alice', 'email': 'alice@example.com', # 'created_at': datetime.datetime(2026, 3, 18, 10, 30)}

#model_dump_json(): преобразование в JSON

# Преобразование в JSON-строку json_str = user.model_dump_json() # '{"id":1,"name":"Alice","email":"alice@example.com","created_at":"2026-03-18T10:30:00"}' # С форматированием json_str = user.model_dump_json(indent=2)

#include: выбор полей для сериализации

# Только указанные поля data = user.model_dump(include={'name', 'email'}) # {'name': 'Alice', 'email': 'alice@example.com'} # С вложенными моделями class Order(BaseModel): id: int user: User items: list[str] order = Order(id=1, user=user, items=["item1", "item2"]) # Включить только name из user data = order.model_dump(include={'id', 'user': {'name'}}) # {'id': 1, 'user': {'name': 'Alice'}}

#exclude: исключение полей

# Исключить поля data = user.model_dump(exclude={'created_at'}) # {'id': 1, 'name': 'Alice', 'email': 'alice@example.com'} # Исключить вложенные поля data = order.model_dump(exclude={'user': {'email'}}) # user без email

#by_alias: использование алиасов

class User(BaseModel): user_name: str = Field(alias="userName") user_id: int = Field(alias="userId") user = User(userName="Alice", userId=1) # По умолчанию (имена полей) data = user.model_dump() # {'user_name': 'Alice', 'user_id': 1} # С алиасами data = user.model_dump(by_alias=True) # {'userName': 'Alice', 'userId': 1}

#exclude_none: пропуск None-значений

class User(BaseModel): name: str email: str | None = None phone: str | None = None user = User(name="Alice", email=None) # По умолчанию data = user.model_dump() # {'name': 'Alice', 'email': None, 'phone': None} # Без None data = user.model_dump(exclude_none=True) # {'name': 'Alice'}

#exclude_defaults: пропуск значений по умолчанию

class User(BaseModel): name: str is_active: bool = True role: str = "user" user = User(name="Alice") # Без значений по умолчанию data = user.model_dump(exclude_defaults=True) # {'name': 'Alice'} # Со значениями по умолчанию data = user.model_dump() # {'name': 'Alice', 'is_active': True, 'role': 'user'}

#mode: режим сериализации

from datetime import datetime class Event(BaseModel): date: datetime event = Event(date=datetime(2026, 3, 18, 10, 30)) # mode='python' (по умолчанию) data = event.model_dump(mode='python') # {'date': datetime.datetime(2026, 3, 18, 10, 30)} # datetime-объект # mode='json' data = event.model_dump(mode='json') # {'date': '2026-03-18T10:30:00'} # ISO-строка

#round_trip: округление для JSON

class Data(BaseModel): value: float data = Data(value=1.123456789) # Обычная сериализация json_str = data.model_dump_json() # '{"value":1.123456789}' # С round_trip (для точного восстановления) json_str = data.model_dump_json(round_trip=True) # '{"value":1.123456789}' # может использовать больше знаков

#Сериализация вложенных моделей

class Address(BaseModel): street: str city: str class User(BaseModel): name: str address: Address user = User( name="Alice", address=Address(street="123 Main St", city="NYC") ) # Полная сериализация data = user.model_dump() # {'name': 'Alice', 'address': {'street': '123 Main St', 'city': 'NYC'}} # Исключение вложенных полей data = user.model_dump(exclude={'address': {'street'}}) # {'name': 'Alice', 'address': {'city': 'NYC'}}

#Сериализация коллекций

class Item(BaseModel): name: str price: float class Order(BaseModel): items: list[Item] order = Order(items=[ Item(name="Mouse", price=29.99), Item(name="Keyboard", price=79.99) ]) # Сериализация списка моделей data = order.model_dump() # {'items': [{'name': 'Mouse', 'price': 29.99}, ...]}

#Практические примеры

#Подготовка ответа API

class UserResponse(BaseModel): id: int name: str email: str password_hash: str # не должен попасть в ответ created_at: datetime model_config = ConfigDict(extra='forbid') def get_user_response(user: UserResponse) -> dict: return user.model_dump( exclude={'password_hash'}, exclude_none=True, by_alias=True )

#Логирование без чувствительных данных

class Config(BaseModel): database_url: str api_key: str debug: bool = False config = Config(database_url="postgres://...", api_key="secret") # Логирование без секретов log_data = config.model_dump(exclude={'api_key'}) logger.info(f"Config: {log_data}")

#Сохранение и восстановление

import json # Сохранение data = user.model_dump_json() with open("user.json", "w") as f: f.write(data) # Восстановление with open("user.json") as f: data = f.read() user = User.model_validate_json(data)

#Мини-проект: Система ответов API

Создайте модели для API ответов:

from pydantic import BaseModel, Field from datetime import datetime from typing import Optional, Generic, TypeVar T = TypeVar('T') class User(BaseModel): id: int username: str email: str password_hash: str # скрыть при сериализации created_at: datetime updated_at: Optional[datetime] = None # Создайте классы: # 1. UserPublic — публичная версия User (без password_hash) # 2. UserCreate — для создания (все поля кроме id, created_at, updated_at) # 3. UserUpdate — для обновления (все поля optional) # 4. APIResponse[T] — обёртка для ответов API # Пример использования: # response = APIResponse(data=user_public, status="success") # json_response = response.model_dump_json(exclude_none=True)

Далее: Вычисляемые поля: @computed_field