✅ Решения

🎯 Ответы на тесты и разбор практики

Часть 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