Упрощенное тестирование Pydantic с имитацией ORM
При изучении Pydantic по моей статье, вы можете столкнуться с необходимостью тестирования метода model_validate(my_obj, from_attributes=True). Чтобы избежать развертывания отдельной базы данных с описанием модели таблицы SQLAlchemy, можно использовать следующий элегантный подход:
1. Создание имитации ORM-класса
Создайте простой класс, имитирующий ORM-модель. Например:
2. Определение Pydantic-модели
Создайте соответствующую Pydantic-модель. Например:
3. Использование модели
Теперь вы можете использовать вашу "ORM-модель" с Pydantic:
Результат
Почему это работает
Этот подход эффективен благодаря мощи объектно-ориентированного программирования в Python. Создавая простой класс MyUser, вы фактически имитируете поведение ORM-модели. Pydantic способен работать с этим классом так же, как он работал бы с реальной ORM-моделью, извлекая атрибуты и применяя свою логику валидации и преобразования.
Такой метод позволяет легко тестировать и демонстрировать функциональность Pydantic без необходимости настройки полноценной базы данных, что особенно удобно для обучения и быстрого прототипирования.
При изучении Pydantic по моей статье, вы можете столкнуться с необходимостью тестирования метода model_validate(my_obj, from_attributes=True). Чтобы избежать развертывания отдельной базы данных с описанием модели таблицы SQLAlchemy, можно использовать следующий элегантный подход:
1. Создание имитации ORM-класса
Создайте простой класс, имитирующий ORM-модель. Например:
from datetime import date
class MyUser:
id = 3
name = "Алексей"
surname = "Яковенко"
birthday_date = date(1993, 2, 19)
2. Определение Pydantic-модели
Создайте соответствующую Pydantic-модель. Например:
from pydantic import BaseModel, computed_field
from dateutil.relativedelta import relativedelta
class User(BaseModel):
id: int
name: str
surname: str
birthday_date: date
@computed_field
def full_name(self) -> str:
return f"{self.name} {self.surname}"
@computed_field
def age(self) -> str:
today = date.today()
delta = relativedelta(today, self.birthday_date)
return f"{delta.years} лет, {delta.months} месяцев и {delta.days} дней"
3. Использование модели
Теперь вы можете использовать вашу "ORM-модель" с Pydantic:
my_obj = MyUser()
alex = User.model_validate(my_obj, from_attributes=True)
print(alex.model_dump())
Результат
{
'id': 3,
'name': 'Алексей',
'surname': 'Яковенко',
'birthday_date': datetime.date(1993, 2, 19),
'full_name': 'Алексей Яковенко',
'age': '31 лет, 7 месяцев и 29 дней'
}
Почему это работает
Этот подход эффективен благодаря мощи объектно-ориентированного программирования в Python. Создавая простой класс MyUser, вы фактически имитируете поведение ORM-модели. Pydantic способен работать с этим классом так же, как он работал бы с реальной ORM-моделью, извлекая атрибуты и применяя свою логику валидации и преобразования.
Такой метод позволяет легко тестировать и демонстрировать функциональность Pydantic без необходимости настройки полноценной базы данных, что особенно удобно для обучения и быстрого прототипирования.