Дополнительные типы данных¶
До сих пор вы использовали простые типы данных, такие как:
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,
}