Как задать время создания экземпляра BaseModel в pydantic

Распаршиваю json в BaseModel от pydantic. Нужен элегантный способ задать время создания экземпляра класса. Пока на уме только опциональное поле и доп метод, но выглядит как костыль.

class Test(BaseModel):
    name: str
    create_time: Optional[datetime]

    def set_create_time(self) -> None:
        self.create_time = datetime.now()

Update:

Данный костыль можно усовершенствовать, чтобы вызов не переносить на отдельную строку.

class Test(BaseModel):
    name: str
    create_time: Optional[datetime]

    def set_create_time(self) -> BaseModel:
        self.create_time = datetime.now()
        return self

Т.е.

test = Test.parse_obj(data).set_create_time()

Вместо

test = Test.parse_obj(data)
test.set_create_time()

Ответы (1 шт):

Автор решения: Andrey Martynov

Предлагаю использовать model_post_init() - метод, выполняющийся при создании экземпляра класса после стандартного __init__() Ниже - пример для часового пояса UTC:

    class Test(BaseModel):
        name: str
        create_time: Optional[datetime]

        def model_post_init(self, __context: Any) -> None:
            self.create_time = datetime.now(UTC)
→ Ссылка