Дополнительные типы данных¶
До сих пор вы использовали простые типы данных, такие как:
intfloatstrbool
Но вы также можете использовать и более сложные типы.
При этом у вас останутся те же возможности , что и до сих пор:
- Отличная поддержка редактора.
 - Преобразование данных из входящих запросов.
 - Преобразование данных для ответа.
 - Валидация данных.
 - Автоматическая аннотация и документация.
 
Другие типы данных¶
Ниже перечислены некоторые из дополнительных типов данных, которые вы можете использовать:
UUID:- Стандартный "Универсальный уникальный идентификатор", используемый в качестве идентификатора во многих базах данных и системах.
 - В запросах и ответах будет представлен как 
str. 
datetime.datetime:- Встроенный в Python 
datetime.datetime. - В запросах и ответах будет представлен как 
strв формате ISO 8601, например:2008-09-15T15:53:00+05:00. 
- Встроенный в Python 
 datetime.date:- Встроенный в Python 
datetime.date. - В запросах и ответах будет представлен как 
strв формате ISO 8601, например:2008-09-15. 
- Встроенный в Python 
 datetime.time:- Встроенный в Python 
datetime.time. - В запросах и ответах будет представлен как 
strв формате ISO 8601, например:14:23:55.003. 
- Встроенный в Python 
 datetime.timedelta:- Встроенный в Python 
datetime.timedelta. - В запросах и ответах будет представлен в виде общего количества секунд типа 
float. - Pydantic также позволяет представить его как "Кодировку разницы во времени ISO 8601", см. документацию для получения дополнительной информации.
 
- Встроенный в Python 
 frozenset:- В запросах и ответах обрабатывается так же, как и 
set:- В запросах будет прочитан список, исключены дубликаты и преобразован в 
set. - В ответах 
setбудет преобразован вlist. - В сгенерированной схеме будет указано, что значения 
setуникальны (с помощью JSON-схемыuniqueItems). 
 - В запросах будет прочитан список, исключены дубликаты и преобразован в 
 
- В запросах и ответах обрабатывается так же, как и 
 bytes:- Встроенный в Python 
bytes. - В запросах и ответах будет рассматриваться как 
str. - В сгенерированной схеме будет указано, что это 
strв форматеbinary. 
- Встроенный в Python 
 Decimal:- Встроенный в Python 
Decimal. - В запросах и ответах обрабатывается так же, как и 
float. 
- Встроенный в Python 
 - Вы можете проверить все допустимые типы данных pydantic здесь: Типы данных Pydantic.
 
Пример¶
Вот пример операции пути с параметрами, который демонстрирует некоторые из вышеперечисленных типов.
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 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 | None = Body(default=None),
    end_datetime: datetime | None = Body(default=None),
    repeat_at: time | None = Body(default=None),
    process_after: 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,
    }
from datetime import datetime, time, timedelta
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 | None = Body(default=None),
    end_datetime: datetime | None = Body(default=None),
    repeat_at: time | None = Body(default=None),
    process_after: 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,
    }