Open10

pydantic2

nicopinnicopin
nicopinnicopin
class TypeEnum(str, enum.Enum):
    TEXT = "text"
    IMAGE = "image"

class TextContent(BaseModel):
    type: Literal[TypeEnum.TEXT]
    text: Annotated[str, StringConstraints(min_length=1, max_length=1000)]

class Sample(TimeStampBaseModel, Document):
    name: str
    content: Annotated[
        Union[TextContent, VideoContent, ImageContent, AudioContent],
        Field(discriminator="type"),
    ]

enumもstrを継承していればエラーとならないが、ただのEnumだと以下エラーとなった。

E       pydantic_core._pydantic_core.ValidationError: 1 validation error for Sample
E       content
E         Input tag 'audio' found using 'type' does not match any of the expected tags: <TypeEnum.TEXT: 'text'>, <TypeEnum.VIDEO: 'video'>, <TypeEnum.IMAGE: 'image'>, <TypeEnum.AUDIO: 'audio'> [type=union_tag_invalid, input_value={'type': 'audio'...': {'en': '', 'ja': ''}}, input_type=dict]
E           For further information visit https://errors.pydantic.dev/2.4/v/union_tag_invalid

nicopinnicopin

E pydantic.errors.PydanticUserError: NotebookPageBlock is not fully defined; you should define header, then call NotebookPageBlock.model_rebuild().

discriminatorで指定したフィールドにEnumを使用していても上記のようなエラーが出ることがある

nicopinnicopin

Enum inside modl serialize

class SomeType(enum.Enum)だとmodel_dump()で文字列にならない。(Fastapiのルーターのテストでmodel_dumpでリクエストボディ作る時に困る。
class Sometype(str, enum.Enum)にしておけばmodel_dump()でちゃんと辞書になる

E       TypeError: Object of type VisibilityEnum is not JSON serializable

nicopinnicopin

もしくはmodel_dump_json()でJson文字列にした後でjson.loads(json_str)で辞書に変換しても良い。

nicopinnicopin

default

Noneの時には設定されず、フィールドが存在しない時にのみワーク