Дополнительные типы данных¶
До сих пор вы использовали простые типы данных, такие как:
- int
- float
- str
- bool
Но вы также можете использовать и более сложные типы.
При этом у вас останутся те же возможности , что и до сих пор:
- Отличная поддержка редактора.
- Преобразование данных из входящих запросов.
- Преобразование данных для ответа.
- Валидация данных.
- Автоматическая аннотация и документация.
Другие типы данных¶
Ниже перечислены некоторые из дополнительных типов данных, которые вы можете использовать:
- 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,
    }