额外数据类型¶
到目前为止,你一直在使用常见的数据类型,例如
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 时间差编码”,详情请查看文档。
- 一个 Python
frozenset:- 在请求和响应中,处理方式与
set相同。- 在请求中,会读取列表,剔除重复项并将其转换为
set。 - 在响应中,
set将被转换为list。 - 生成的模式(schema)将指定
set中的值是唯一的(使用 JSON Schema 的uniqueItems)。
- 在请求中,会读取列表,剔除重复项并将其转换为
- 在请求和响应中,处理方式与
bytes:- 标准 Python
bytes。 - 在请求和响应中将被视为
str。 - 生成的模式将指定它是一个带有
binary“格式”的str。
- 标准 Python
Decimal:- 标准 Python
Decimal。 - 在请求和响应中,处理方式与
float相同。
- 标准 Python
- 你可以在此处查看所有有效的 Pydantic 数据类型:Pydantic 数据类型。
示例¶
这是一个使用上述某些类型的参数的路径操作示例。
from datetime import datetime, time, timedelta
from typing import Annotated
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: Annotated[datetime, Body()],
end_datetime: Annotated[datetime, Body()],
process_after: Annotated[timedelta, Body()],
repeat_at: Annotated[time | None, Body()] = 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,
"process_after": process_after,
"repeat_at": repeat_at,
"start_process": start_process,
"duration": duration,
}
🤓 其他版本和变体
提示
如果可能,请优先使用 Annotated 版本。
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 = Body(),
end_datetime: datetime = Body(),
process_after: timedelta = Body(),
repeat_at: time | 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,
"process_after": process_after,
"repeat_at": repeat_at,
"start_process": start_process,
"duration": duration,
}
请注意,函数内部的参数拥有其原生的数据类型,例如,你可以执行正常的日期操作,如
from datetime import datetime, time, timedelta
from typing import Annotated
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: Annotated[datetime, Body()],
end_datetime: Annotated[datetime, Body()],
process_after: Annotated[timedelta, Body()],
repeat_at: Annotated[time | None, Body()] = 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,
"process_after": process_after,
"repeat_at": repeat_at,
"start_process": start_process,
"duration": duration,
}
🤓 其他版本和变体
提示
如果可能,请优先使用 Annotated 版本。
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 = Body(),
end_datetime: datetime = Body(),
process_after: timedelta = Body(),
repeat_at: time | 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,
"process_after": process_after,
"repeat_at": repeat_at,
"start_process": start_process,
"duration": duration,
}