Open1

Pydantic v2で値オブジェクトを実現する方法

Nakano as a ServiceNakano as a Service
from pydantic import BaseModel, Field, RootModel


class UserId(RootModel):
    root: int = Field(..., ge=1)


class UserName(RootModel):
    root: str = Field(..., min_length=1, max_length=10)


class User(BaseModel):
    id: UserId
    name: UserName
id_x = UserId.parse_obj(1)
id_y = UserId.parse_obj(1)
id_z = UserId.parse_obj(2)

print(id_x == id_y)  # True
print(id_x == id_z)  # False

なおv1ではBaseModel__root__プロパティを宣言することで実現できた。