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",
)