Open10
pydantic2
Discriminated Union
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
E pydantic.errors.PydanticUserError:
NotebookPageBlock
is not fully defined; you should defineheader
, then callNotebookPageBlock.model_rebuild()
.
discriminator
で指定したフィールドにEnumを使用していても上記のようなエラーが出ることがある
StringConstraints
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
もしくはmodel_dump_json()
でJson文字列にした後でjson.loads(json_str)
で辞書に変換しても良い。
Regex engine
pydantic2になってRustベースになったため正規表現部分もRustで解析されるが一部look-behindなどがサポートされていないので、正規表現の解析はPythonにしたい場合はModel単位でフラグを立ててあげる必要がある。
default
Noneの時には設定されず、フィールドが存在しない時にのみワーク