Атрибуты Pydantic set с функцией по умолчанию

Можно ли передать установщики функций для неизменяемых моделей Pydantic.

Например:

from uuid import uuid4, UUID
from pydantic import BaseModel
from datetime import datetime

def generate_uuid():
    return uuid4()

def get_datetimenow():
    return datetime.now()

class Item(BaseModel):

    class Config:
        allow_mutation = False
        extra = "forbid"

    id: UUID
    created_at: datetime

Я хочу, чтобы методы generate_uuid и get_datetimenow устанавливали атрибуты.

>>> Item()
ValidationError: 2 validation errors for Item
id
  field required (type=value_error.missing)
created_at
  field required (type=value_error.missing)

Хотя я хочу получить объект Item с автоматическими установками id и created_at. Такой же результат, как и при беге:

>>> Item(id=generate_uuid(), created_at=get_datetimenow())
Item(id=UUID('8f898730-3fad-4ca9-9667-c090f62a2954'), created_at=datetime.datetime(2021, 1, 19, 21, 13, 7, 58051))

person Joost Döbken    schedule 19.01.2021    source источник


Ответы (1)


Вы можете использовать параметр default_factory для Field с произвольной функцией. Вот так:

from uuid import uuid4, UUID
from pydantic import BaseModel, Field
from datetime import datetime

class Item(BaseModel):

    class Config:
        allow_mutation = False
        extra = "forbid"

    id: UUID = Field(default_factory=uuid4)
    created_at: datetime = Field(default_factory=datetime.now)
person alex_noname    schedule 20.01.2021