Open2
FastAPI やら Pydantic v2 やらメモ
モデルのフィールドの型にバリデーションを追加したい場合
以下は文字列の例。
class MyModel(BaseModel):
bar: str = Field(max_length=10)
# 型ヒントのAnnotatedでも書ける
class MyModel2(BaseModel):
bar: Annotated[str, Field(max_length=10)]
# FieldではなくStringConstraintsでも書ける(文字列の場合)
class MyModel3(BaseModel):
bar: Annotated[str, StringConstraints(max_length=10)]
部分更新なAPIを実装したい場合
FastAPIで部分更新(PATCH)なAPIを作成したいときは、以下のように更新用のモデルの項目のデフォルト値をNone
を設定しておく(別にNone
でなくて良いが)。こうすることで、リクエストにその項目が含まれていない場合、その項目にデフォルト値をセットしてくれるため、部分更新なIFを提供できる。
# 作成用リクエストモデル
class MyModelCreate(BaseModel):
bar: str
foo: str | None = Field(default=None)
# 部分更新用リクエストモデル
class MyModelUpdate(BaseModel):
bar: str | None = Field(default=None)
foo: str | None = Field(default=None)
つまり、更新APIに対するリクエストは以下の感じでも良くなる。
{
"foo": "hogehoge"
}
しかし、その項目が作成時には必須かつNULLを許容していない項目(上の例ではbar
)の場合、FastAPIのドキュメント出力機能で出力したドキュメントには、「NULL
もセット可能」のように見えてしまうため、API利用者は混乱するかもしれない。
バックエンド側では、model_dump(exclude_unset=True)
を使うことで、明示的にNULL
がセットされたのか、それとも項目が省略されてデフォルト値がセットされたかの区別は可能。そのため、本来NULL
を許容したくない項目に明示的にNULL
がセットされたときはエラーを返す、みたいなことはできるので大きな問題ではないだろうが・・・。