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

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

@potapov_me

Платформа

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

Контент

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

Компания

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

Аккаунт

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

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

·ИП Потапов К.С.·Политика конфиденциальности·
Сделано с ❤️ в России
  1. Конфигурация моделей: ConfigDict
model_config

Конфигурация моделей: ConfigDict

Настройка поведения моделей через ConfigDict: str_strip_whitespace, extra, populate_by_name и другие.

Конфигурация моделей: ConfigDict

ConfigDict позволяет настроить поведение модели под ваши нужды

#Базовое использование ConfigDict

ConfigDict задаётся как атрибут model_config:

from pydantic import BaseModel, ConfigDict class User(BaseModel): model_config = ConfigDict( str_strip_whitespace=True, extra='forbid', populate_by_name=True ) name: str email: str user = User(name=" Alice ", email="alice@example.com") print(user.name) # "Alice" (пробелы удалены)

#Работа с лишними полями: extra

Параметр extra управляет поведением при наличии лишних полей во входных данных:

#extra='ignore' (по умолчанию)

from pydantic import BaseModel, ConfigDict class User(BaseModel): model_config = ConfigDict(extra='ignore') name: str # Лишние поля игнорируются user = User(name="Alice", age=25, email="alice@example.com") print(user) # User(name='Alice') print(user.model_dump()) # {'name': 'Alice'}

#extra='forbid'

from pydantic import BaseModel, ConfigDict class User(BaseModel): model_config = ConfigDict(extra='forbid') name: str # Лишние поля вызывают ошибку try: user = User(name="Alice", age=25) except Exception as e: print(e) # ValidationError: Extra inputs are not permitted

#extra='allow'

from pydantic import BaseModel, ConfigDict class User(BaseModel): model_config = ConfigDict(extra='allow') name: str # Лишние поля сохраняются user = User(name="Alice", age=25, email="alice@example.com") print(user.name) # "Alice" print(user.age) # 25 print(user.email) # "alice@example.com" # model_dump включает лишние поля print(user.model_dump()) # {'name': 'Alice', 'age': 25, 'email': 'alice@example.com'}

#Обработка строк: str_strip_whitespace

from pydantic import BaseModel, ConfigDict class User(BaseModel): model_config = ConfigDict(str_strip_whitespace=True) name: str email: str user = User(name=" Alice ", email=" alice@example.com ") print(user.name) # "Alice" print(user.email) # "alice@example.com"

#str_to_lower и str_to_upper

class User(BaseModel): model_config = ConfigDict(str_to_lower=True) email: str username: str user = User(email="ALICE@EXAMPLE.COM", username="ALICE") print(user.email) # "alice@example.com" print(user.username) # "alice"

#populate_by_name: работа с alias

from pydantic import BaseModel, ConfigDict, Field class User(BaseModel): model_config = ConfigDict(populate_by_name=True) user_name: str = Field(alias="userName") # Работают оба варианта user1 = User(userName="Alice") # через alias user2 = User(user_name="Bob") # через имя поля # Сериализация print(user1.model_dump()) # {'user_name': 'Alice'} print(user1.model_dump(by_alias=True)) # {'userName': 'Alice'}

#validate_assignment: валидация при присваивании

from pydantic import BaseModel, ConfigDict, Field class User(BaseModel): model_config = ConfigDict(validate_assignment=True) age: int = Field(ge=0, le=150) user = User(age=25) # Валидация при присваивании user.age = 30 # OK user.age = 200 # ValidationError: Input should be less than or equal to 150

Без validate_assignment валидация происходит только при создании:

class User(BaseModel): age: int = Field(ge=0, le=150) user = User(age=25) user.age = 200 # OK, валидация не применяется

#frozen: неизменяемая модель

from pydantic import BaseModel, ConfigDict class User(BaseModel): model_config = ConfigDict(frozen=True) name: str age: int user = User(name="Alice", age=25) # Попытка изменения вызывает ошибку try: user.age = 26 except Exception as e: print(e) # ValidationError: Instance "User" is frozen

#arbitrary_types_allowed

from pydantic import BaseModel, ConfigDict from datetime import datetime class CustomClass: pass class Data(BaseModel): model_config = ConfigDict(arbitrary_types_allowed=True) custom: CustomClass created: datetime obj = CustomClass() data = Data(custom=obj, created=datetime.now())

#from_attributes: валидация из ORM

from pydantic import BaseModel, ConfigDict class User(BaseModel): model_config = ConfigDict(from_attributes=True) id: int name: str email: str # ORM-подобный объект class DBUser: def __init__(self, id, name, email): self.id = id self.name = name self.email = email db_user = DBUser(1, "Alice", "alice@example.com") # Валидация из атрибутов объекта user = User.model_validate(db_user) print(user.name) # "Alice"

#title и description для схемы

from pydantic import BaseModel, ConfigDict class User(BaseModel): model_config = ConfigDict( title="Пользователь", json_schema_extra={ "description": "Модель пользователя системы", "examples": [{"name": "Alice", "age": 25}] } ) name: str age: int schema = User.model_json_schema() print(schema['title']) # "Пользователь"

#Комбинирование опций

class Product(BaseModel): model_config = ConfigDict( str_strip_whitespace=True, extra='forbid', validate_assignment=True, frozen=False, populate_by_name=True, json_schema_extra={ "description": "Модель товара", "examples": [ {"name": "Widget", "price": 19.99} ] } ) name: str = Field(alias="productName") price: float = Field(gt=0)

#Мини-проект: Конфигурация для API-моделей

Создайте базовый класс для API-моделей с правильной конфигурацией:

from pydantic import BaseModel, ConfigDict, Field from datetime import datetime class BaseAPIModel(BaseModel): model_config = ConfigDict( # Настройте: # - extra='forbid' (запретить лишние поля) # - str_strip_whitespace=True (очистка строк) # - validate_assignment=True (валидация при изменении) # - populate_by_name=True (aliases и имена полей) # - json_schema_extra с описанием pass class UserCreate(BaseAPIModel): # username: 3-20 символов, alias "username" # email: email # password: минимум 8 символов pass class UserResponse(BaseAPIModel): # id: int # username: str # email: str # created_at: datetime # is_active: bool = True pass # Проверьте: # 1. Лишние поля вызывают ошибку # 2. Пробелы в строках очищаются # 3. Валидация работает при присваивании

Далее: TypeAdapter: валидация вне моделей