更多数据类型¶
至此,我们使用的都是常见数据类型,如:
int
float
str
bool
但其实也可以使用更复杂的数据类型。
而且,拥有同样强悍的功能:
- 强大的编辑器支持
- 转换请求数据
- 转换响应数据
- 数据校验
- 自动补全和 API 文档
其他数据类型¶
下面介绍更多数据类型:
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
- 生成的概图(使用 JSON Schema 的
uniqueItems
)指明set
中的值是唯一的
- 在请求中,读取列表,去除重复项,并转换为
- 在请求和响应中与
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,
}