✅ Решения
Часть 1. Ответы на тест
Вопрос 1
Ответ: B) Библиотека для валидации данных через аннотации типов
Pydantic не является веб-фреймворком, ORM или шаблонизатором. Его основная задача — валидация и сериализация данных.
Вопрос 2
Ответ: B) BaseModel
Все модели Pydantic наследуются от BaseModel, импортируемого из pydantic.
Вопрос 3
Ответ: C) model_validate_json()
В Pydantic v2 метод model_validate_json() преобразует JSON-строку в объект модели. В v1 использовался parse_raw().
Вопрос 4
Ответ: B) Значение должно быть больше 0
gt = greater than (больше чем). ge = greater or equal.
Вопрос 5
Ответ: C) @field_validator
В Pydantic v2 используется @field_validator. В v1 использовался @validator.
Вопрос 6
Ответ: B) Задаёт альтернативное имя поля в JSON
alias позволяет использовать другое имя в JSON, отличное от имени атрибута Python. Например, available в JSON → in_stock в Python.
Вопрос 7
Ответ: B) Config
Настройки модели задаются внутри неё. В Pydantic v2 это атрибут model_config = ConfigDict(str_strip_whitespace=True, validate_assignment=True, ...); в v1 это был вложенный class Config. Кастомная сериализация — через @field_serializer (заменил json_encoders).
Часть 2. Решения практических заданий
Задание 1. Простая модель
from pydantic import BaseModel
class User(BaseModel):
name: str
age: int
email: str
user = User(name="Anna", age=25, email="anna@example.com")
print(user)
# Неверный тип — вызовет ValidationError
# User(name="Anna", age="not_a_number", email="anna@example.com")
Задание 2. Вложенная модель
from pydantic import BaseModel
class Address(BaseModel):
city: str
street: str
house_number: int
class User(BaseModel):
name: str
age: int
address: Address
address = Address(city="Berlin", street="Main St", house_number=42)
user = User(name="John", age=30, address=address)
print(user.address.city) # Berlin
Задание 3. JSON ↔ Pydantic
from pydantic import BaseModel
class User(BaseModel):
name: str
age: int
json_string = '{"name": "Alice", "age": 28}'
# JSON → модель
user = User.model_validate_json(json_string, strict=True)
print(user) # name='Alice' age=28
# Модель → JSON
output = user.model_dump_json()
print(output) # {"name":"Alice","age":28}
Задание 4. Field с ограничениями
from pydantic import BaseModel, Field
class Product(BaseModel):
name: str = Field(..., min_length=2)
price: float = Field(gt=0)
quantity: int = Field(ge=0)
# Успешно
product = Product(name="Laptop", price=999.99, quantity=5)
# Ошибка: name слишком короткое
# Product(name="A", price=10, quantity=5)
# Ошибка: price не больше 0
# Product(name="Book", price=-5, quantity=10)
Задание 5. Кастомный валидатор
from pydantic import BaseModel, model_validator
class Employee(BaseModel):
age: int
is_employed: bool
@model_validator(mode='after')
def check_employment_age(self):
if self.is_employed and not (18 <= self.age <= 65):
raise ValueError(
"Если занят, возраст должен быть от 18 до 65"
)
return self
# Успешно
emp = Employee(age=30, is_employed=True)
# Ошибка
# Employee(age=70, is_employed=True)
Задание 6. model_config (ConfigDict)
from pydantic import BaseModel, ConfigDict
class User(BaseModel):
model_config = ConfigDict(
str_strip_whitespace=True,
str_min_length=2,
validate_assignment=True,
)
name: str
age: int
user = User(name=" Anna ", age=25)
print(user.name) # "Anna" (пробелы обрезаны)
# Ошибка при присваивании
# user.name = "A" # ValidationError: min length 2