追加データ型¶
今までは、以下のような一般的なデータ型を使用してきました:
- int
- float
- str
- bool
しかし、より複雑なデータ型を使用することもできます。
そして、今まで見てきたのと同じ機能を持つことになります:
- 素晴らしいエディタのサポート
- 受信したリクエストからのデータ変換
- レスポンスデータのデータ変換
- データの検証
- 自動注釈と文書化
他のデータ型¶
ここでは、使用できる追加のデータ型のいくつかを紹介します:
- 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,
    }