Настройка поведения моделей через ConfigDict: str_strip_whitespace, extra, populate_by_name и другие.
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 управляет поведением при наличии лишних полей во входных данных:
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'}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 permittedfrom 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'}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"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"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'}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, валидация не применяется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 frozenfrom 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 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"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-моделей с правильной конфигурацией:
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 для валидации без моделей.
Вопросы ещё не добавлены
Вопросы для этой подтемы ещё не добавлены.