PydanticモデルでのJSONスキーマデータ
FastAPIは、Pydanticモデルを使用してリクエストボディのデータを宣言します。これにより、データの型チェック、バリデーション、シリアライゼーションが自動的に行われます。
以下に、Pydanticモデルを使用したJSONスキーマデータの例を示します。
from pydantic import BaseModel
class Item(BaseModel):
name: str
description: str = None
price: float
tax: float = None
このItem
モデルでは、name
、description
、price
、tax
という4つのフィールドが定義されています。name
とprice
は必須で、description
とtax
はオプションです。
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=True
はmode='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件のコメント