PydanticモデルでのJSONスキーマデータ

FastAPIは、Pydanticモデルを使用してリクエストボディのデータを宣言します。これにより、データの型チェック、バリデーション、シリアライゼーションが自動的に行われます。

以下に、Pydanticモデルを使用したJSONスキーマデータの例を示します。

from pydantic import BaseModel

class Item(BaseModel):
    name: str
    description: str = None
    price: float
    tax: float = None

このItemモデルでは、namedescriptionpricetaxという4つのフィールドが定義されています。namepriceは必須で、descriptiontaxはオプションです。

FastAPIは、このPydanticモデルを使用して、リクエストボディのデータを自動的に解析し、バリデーションを行い、JSONスキーマを生成します。これにより、APIのドキュメンテーションとテストが容易になります。

また、Pydanticモデルは、データのシリアライゼーションとデシリアライゼーションも自動的に行います。これにより、APIの開発が大幅に簡素化されます。

Pydantic v2とv1の違い

PydanticはPythonのデータバリデーションと設定管理ライブラリで、FastAPIではリクエストとレスポンスのモデルを定義するために使用されます。Pydantic v1からv2へのアップグレードは、いくつかの重要な変更と改善をもたらしました。

性能向上

Pydantic v2では、バリデーション部分の実装がRustで書き直され、その結果、バリデーション処理が4~50倍高速化されました。これは、FastAPIで使用した場合の応答時間にも影響を与え、全体的なパフォーマンス向上に寄与します。

APIの変更

Pydantic v2では、APIが一部変更されており、これにより使い勝手が向上しています。例えば、validatorの関数名がfield_validatorに、root_validatorの関数名がmodel_validatorに変更されました。また、pre=Truemode='before'に変更されています。

Configクラスの変更

Pydantic v1では、BaseModelを継承したモデルの各種設定のためにConfigという名前の内部クラスを定義する仕様でした。これがv2では、model_config = pydantic.ConfigDict(...)の要領でフィールドとして定義するように改められています。

その他の変更

Pydantic v2では、その他にもいくつかの変更があります。例えば、BaseSettingsが別パッケージのpydantic-settingsになったり、既定値がNoneの場合は、=Noneの指定が必須になったりしています。

以上のように、Pydantic v2はv1に比べて多くの改善をもたらしています。これらの変更により、FastAPIを使用した開発がさらに便利になりました。

Field関数を使用した追加の例

FastAPIとPydanticでは、Field関数を使用してモデルのフィールドに追加の情報を提供することができます。これは、APIのドキュメンテーションを自動生成する際に特に役立ちます。

以下に、Field関数を使用した例を示します。

from pydantic import BaseModel, Field

class Item(BaseModel):
    name: str = Field(..., title="The name of the item", max_length=300)
    description: str = Field(None, title="The description of the item", max_length=500)
    price: float = Field(..., title="The price of the item", gt=0)
    tax: float = Field(None, title="The tax on the item", min=0)

この例では、各フィールドにField関数を使用して追加の情報を提供しています。Field関数の第一引数はデフォルト値で、...は必須を意味します。その後の引数には、フィールドのタイトルやバリデーションルール(max_length, min, gtなど)を指定できます。

FastAPIは、これらの情報を使用してAPIのドキュメンテーションを自動生成します。これにより、APIの使用者は各フィールドの目的や制約を容易に理解することができます。また、Pydanticはこれらの情報を使用してデータのバリデーションを行います。これにより、APIの開発者はデータのバリデーション処理を手動で書く必要がなくなります。

OpenAPI内のJSONスキーマでの例

FastAPIは、Pydanticモデルを使用してOpenAPIスキーマを自動的に生成します。これにより、APIのドキュメンテーションとクライアントコードの生成が容易になります。

以下に、OpenAPIスキーマ内のJSONスキーマの例を示します。

{
  "Item": {
    "title": "Item",
    "type": "object",
    "properties": {
      "name": {
        "title": "The name of the item",
        "type": "string",
        "description": "The name of the item",
        "maxLength": 300
      },
      "description": {
        "title": "The description of the item",
        "type": "string",
        "description": "The description of the item",
        "maxLength": 500
      },
      "price": {
        "title": "The price of the item",
        "type": "number",
        "description": "The price of the item",
        "minimum": 0
      },
      "tax": {
        "title": "The tax on the item",
        "type": "number",
        "description": "The tax on the item",
        "minimum": 0
      }
    },
    "required": ["name", "price"]
  }
}

このJSONスキーマは、Itemモデルの各フィールドの型、タイトル、説明、バリデーションルール(maxLength, minimumなど)を定義しています。また、requiredフィールドは、必須のフィールドをリストしています。

FastAPIは、このJSONスキーマを使用してOpenAPIドキュメンテーションを自動生成します。これにより、APIの使用者は各エンドポイントのリクエストとレスポンスの形式を容易に理解することができます。また、このドキュメンテーションは、クライアントコードの生成にも使用できます。

Body関数での例

FastAPIとPydanticでは、Body関数を使用してリクエストボディのデータを宣言することができます。これは、APIのドキュメンテーションを自動生成する際に特に役立ちます。

以下に、Body関数を使用した例を示します。

from fastapi import FastAPI, Body
from pydantic import BaseModel

class Item(BaseModel):
    name: str
    description: str = None
    price: float
    tax: float = None

app = FastAPI()

@app.post("/items/")
async def create_item(item: Item = Body(..., embed=True)):
    return {"item": item}

この例では、Body関数を使用してItemモデルのインスタンスをリクエストボディから取得しています。Body関数の第一引数はデフォルト値で、...は必須を意味します。embed=Trueは、リクエストボディが{"item": {...}}の形式であることを示しています。

FastAPIは、この情報を使用してAPIのドキュメンテーションを自動生成します。これにより、APIの使用者は各エンドポイントのリクエストとレスポンスの形式を容易に理解することができます。また、Pydanticはこれらの情報を使用してデータのバリデーションを行います。これにより、APIの開発者はデータのバリデーション処理を手動で書く必要がなくなります。

カテゴリー: 未分類

0件のコメント

コメントを残す

アバタープレースホルダー

メールアドレスが公開されることはありません。 が付いている欄は必須項目です