コンテンツにスキップ

Pydantic で Generic を扱う

from typing import Generic, TypeVar

from pydantic import BaseModel
from pydantic.generics import GenericModel

InnerT = TypeVar('InnerT')

class Outer(GenericModel, Generic[InnerT]):
    data: InnerT | None

class InnerX(BaseModel):
    x: int = 1

class InnerY(BaseModel):
    Y: str = "foo"

class InnerZ(BaseModel):
    z: bool = True

ModelX = Outer[InnerX]
#{'data': {'x': 1} }
ModelY = Outer[InnerY]
#{'data': {'y': "foo"} }
ModelZ = Outer[InnerZ]
#{'data': {'z': true} }

モデルの動的生成

Generic と関係ないがモデルの動的生成ができる。

from pydantic import BaseModel, create_model


class FooModel(BaseModel):
    foo: str
    bar: int = 123


BarModel = create_model(
    'BarModel',
    apple='russet',
    banana='yellow',
    __base__=FooModel,
)
print(BarModel)
#> <class 'pydantic.main.BarModel'>
print(BarModel.__fields__.keys())
#> dict_keys(['foo', 'bar', 'apple', 'banana'])

参考