🐛 Типичные ошибки
Ошибка 1. Забываешь импортировать @field_validator
Симптом: код падает с ошибкой NameError: name 'field_validator' is not defined.
Причина: в Pydantic v2 валидаторы полей явно импортируются из pydantic.
# ❌ Неправильно
from pydantic import BaseModel
# ✅ Правильно
from pydantic import BaseModel, field_validator
Ошибка 2. Используешь не те методы сериализации
Симптом: объект модели не превращается в словарь или JSON-строку ожидаемым способом.
Причина: в Pydantic v2 для сериализации и разбора JSON есть отдельные методы model_*.
# ✅ Pydantic v2
user.model_dump()
user.model_dump_json()
User.model_validate_json(json_str)
Ошибка 3. Забыл установить pydantic[email]
Симптом: ImportError: email-validator is not installed при использовании EmailStr.
Решение:
pip install pydantic[email]
Ошибка 4. Неправильно используешь Ellipsis
Симптом: поле не считается обязательным или вызывает путаницу.
Причина: в Pydantic v2 поле без значения по умолчанию и без = Field(...) всё равно обязательное. Ellipsis нужен только внутри Field() для явности.
# ✅ Обязательное поле (без Ellipsis тоже работает)
name: str
# ✅ Явное указание обязательности внутри Field
name: str = Field(..., min_length=2)
Ошибка 5. Забываешь mode='after' в model_validator
Симптом: model_validator не работает как ожидается, или Pydantic ругается на сигнатуру.
Решение: в Pydantic v2 нужно явно указать режим:
@model_validator(mode='after')
def check_something(self):
...
Ошибка 6. Путаешь ge и gt
Симптом: валидация пропускает 0, когда ожидалось, что 0 будет отклонено.
# ❌ Принимает 0 (greater or equal)
price: float = Field(ge=0)
# ✅ Отклоняет 0 (greater than)
price: float = Field(gt=0)
Ошибка 7. Изменяешь поле модели напрямую без validate_assignment
Симптом: присваивание некорректного значения полю не вызывает ошибку.
# Без model_config — присваивание не валидируется
user.age = "not_a_number" # Пройдёт молча!
# ✅ С validate_assignment
from pydantic import ConfigDict
model_config = ConfigDict(validate_assignment=True)