Pydanticモデルの設定

by_name、by_alias系が難しい。 ベストがどうかはっきりしない。

validate_by_name=Trueは、Pythonのソースコード内に辞書構造を書く必要がある時にキャメルケースで書かなくて良いので見た目が荒れにくい。

alias_generator=to_camelはフロントとの兼ね合いで必須。

FastAPIで、APIの入出力に使用するスキーマとそうでないスキーマで継承元クラスを分けると継承関係が複雑になってケアレスミスが発生する。 内部で使用するスキーマで、キャメルケースを使って欲しく無い箇所だけ設定をオプトアウトするのが良いかも。 定義したスキーマの殆どは、最初は内部だけのつもりでもいろんな経緯はあれどAPIに関連してくる事が殆どなので。

use_attribute_docstrings=Trueはめちゃくちゃ便利。FastAPIなら必須。

厳密系は基本全部有効から始めた方が良いと思われ。 frozenだけはコードの書き方(テスト含む)に割と影響して来て、面倒になりがちなので確固たる意志を持ってやる。

from pydantic import BaseModel, ConfigDict
from pydantic.alias_generators import to_camel
 
 
class AppBaseSchema(BaseModel):
    my_attr: int
 
    model_config = ConfigDict(
        #
        # バリデーションがしっかり動くようにするための設定
        #
        # デフォルト値もバリデーションする
        # https://docs.pydantic.dev/latest/api/config/#pydantic.config.ConfigDict.validate_default
        validate_default=True,
        # バリデーターの返り値をバリデーションする
        # https://docs.pydantic.dev/latest/api/config/#pydantic.config.ConfigDict.validate_return
        validate_return=True,
        # 代入時にバリデーションする
        # https://docs.pydantic.dev/latest/api/config/#pydantic.config.ConfigDict.validate_assignment
        validate_assignment=True,
        #
        # こまごました挙動
        #
        # +inf, -inf, nanを許可しない
        # https://docs.pydantic.dev/latest/api/config/#pydantic.config.ConfigDict.allow_inf_nan
        allow_inf_nan=False,
        # ORMのモデルからの変換を可能にする
        # https://docs.pydantic.dev/latest/api/config/#pydantic.config.ConfigDict.from_attributes
        from_attributes=True,
        #
        # FastAPIで便利
        #
        # docstringがdescriptionにも使われるようにする
        # https://docs.pydantic.dev/latest/api/config/#pydantic.config.ConfigDict.use_attribute_docstrings
        use_attribute_docstrings=True,
        #
        # フロントエンドのJSのコードにスネークケースを紛れ込ませないため
        #
        # キャメルケースに変換する
        # https://docs.pydantic.dev/latest/api/config/#pydantic.alias_generators.to_camel
        alias_generator=to_camel,
        # キャメルケースとスネークケース両方を受け入れる
        # https://docs.pydantic.dev/latest/api/config/#pydantic.config.ConfigDict.validate_by_name
        validate_by_name=True,
        #
        # 検討の余地あり
        #
        # 不変にする
        # https://docs.pydantic.dev/latest/api/config/#pydantic.config.ConfigDict.frozen
        # frozen=True,
        # 厳格モードにする
        # https://docs.pydantic.dev/latest/api/config/#pydantic.config.ConfigDict.strict
        # strict=True,
        # 検証時にプロパティのスキーマを再検証する
        # https://docs.pydantic.dev/latest/api/config/#pydantic.config.ConfigDict.revalidate_instances
        # revalidate_instances="always",
    )