Open2

FastAPI やら Pydantic v2 やらメモ

hamasato0000hamasato0000

モデルのフィールドの型にバリデーションを追加したい場合

以下は文字列の例。

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)]
hamasato0000hamasato0000

部分更新な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がセットされたときはエラーを返す、みたいなことはできるので大きな問題ではないだろうが・・・。