追加データ型¶
今までは、以下のような一般的なデータ型を使用してきました:
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: Union[datetime, None] = Body(default=None),
    end_datetime: Union[datetime, None] = Body(default=None),
    repeat_at: Union[time, None] = Body(default=None),
    process_after: Union[timedelta, 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,
        "repeat_at": repeat_at,
        "process_after": process_after,
        "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: Union[datetime, None] = Body(default=None),
    end_datetime: Union[datetime, None] = Body(default=None),
    repeat_at: Union[time, None] = Body(default=None),
    process_after: Union[timedelta, 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,
        "repeat_at": repeat_at,
        "process_after": process_after,
        "start_process": start_process,
        "duration": duration,
    }