追加データ型¶
今までは、以下のような一般的なデータ型を使用してきました:
intfloatstrbool
しかし、より複雑なデータ型を使用することもできます。
そして、今まで見てきたのと同じ機能を持つことになります:
- 素晴らしいエディタのサポート
- 受信したリクエストからのデータ変換
- レスポンスデータのデータ変換
- データの検証
- 自動注釈と文書化
他のデータ型¶
ここでは、使用できる追加のデータ型のいくつかを紹介します:
UUID:- 多くのデータベースやシステムで共通のIDとして使用される、標準的な「ユニバーサルにユニークな識別子」です。
- リクエストとレスポンスでは
strとして表現されます。
datetime.datetime:- Pythonの
datetime.datetimeです。 - リクエストとレスポンスはISO 8601形式の
strで表現されます:2008-09-15T15:53:00+05:00
- Pythonの
datetime.date:- Pythonの
datetime.dateです。 - リクエストとレスポンスはISO 8601形式の
strで表現されます:2008-09-15
- Pythonの
datetime.time:- Pythonの
datetime.time. - リクエストとレスポンスはISO 8601形式の
strで表現されます:14:23:55.003
- Pythonの
datetime.timedelta:- Pythonの
datetime.timedeltaです。 - リクエストとレスポンスでは合計秒数の
floatで表現されます。 - Pydanticでは「ISO 8601 time diff encoding」として表現することも可能です。詳細はドキュメントを参照してください。
- Pythonの
frozenset:- リクエストとレスポンスでは
setと同じように扱われます:- リクエストでは、リストが読み込まれ、重複を排除して
setに変換されます。 - レスポンスでは
setがlistに変換されます。 - 生成されたスキーマは
setの値が一意であることを指定します(JSON SchemaのuniqueItemsを使用します)。
- リクエストでは、リストが読み込まれ、重複を排除して
- リクエストとレスポンスでは
bytes:- Pythonの標準的な
bytesです。 - リクエストとレスポンスでは
strとして扱われます。 - 生成されたスキーマは
strでbinaryの「フォーマット」持つことを指定します。
- Pythonの標準的な
-
Decimal:- Pythonの標準的な
Decimalです。 - リクエストやレスポンスでは
floatと同じように扱います。
- Pythonの標準的な
-
Pydanticの全ての有効な型はこちらで確認できます: Pydantic data types。
例¶
ここでは、上記の型のいくつかを使用したパラメータを持つpath operationの例を示します。
from datetime import datetime, time, timedelta
from typing import Union
from uuid import UUID
from fastapi import Body, FastAPI
app = FastAPI()
@app.put("/items/{item_id}")
async def read_items(
item_id: UUID,
start_datetime: datetime = Body(),
end_datetime: datetime = Body(),
process_after: timedelta = Body(),
repeat_at: Union[time, None] = Body(default=None),
):
start_process = start_datetime + process_after
duration = end_datetime - start_process
return {
"item_id": item_id,
"start_datetime": start_datetime,
"end_datetime": end_datetime,
"process_after": process_after,
"repeat_at": repeat_at,
"start_process": start_process,
"duration": duration,
}
関数内のパラメータは自然なデータ型を持っていることに注意してください。そして、以下のように通常の日付操作を行うことができます:
from datetime import datetime, time, timedelta
from typing import Union
from uuid import UUID
from fastapi import Body, FastAPI
app = FastAPI()
@app.put("/items/{item_id}")
async def read_items(
item_id: UUID,
start_datetime: datetime = Body(),
end_datetime: datetime = Body(),
process_after: timedelta = Body(),
repeat_at: Union[time, None] = Body(default=None),
):
start_process = start_datetime + process_after
duration = end_datetime - start_process
return {
"item_id": item_id,
"start_datetime": start_datetime,
"end_datetime": end_datetime,
"process_after": process_after,
"repeat_at": repeat_at,
"start_process": start_process,
"duration": duration,
}