Упрощенное тестирование Pydantic с имитацией ORM



При изучении 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 без необходимости настройки полноценной базы данных, что особенно удобно для обучения и быстрого прототипирования.