使用数据类¶
FastAPI 建立在 Pydantic 之上,我一直在向你展示如何使用 Pydantic 模型来声明请求和响应。
但 FastAPI 同样支持以相同的方式使用 dataclasses
:
from dataclasses import dataclass
from typing import Union
from fastapi import FastAPI
@dataclass
class Item:
name: str
price: float
description: Union[str, None] = None
tax: Union[float, None] = None
app = FastAPI()
@app.post("/items/")
async def create_item(item: Item):
return item
这仍然得到支持,归功于 Pydantic,因为它有 对 dataclasses
的内部支持。
因此,即使上面的代码没有显式使用 Pydantic,FastAPI 也在使用 Pydantic 将这些标准数据类转换为 Pydantic 自己的数据类风格。
当然,它支持相同的:
- 数据验证
- 数据序列化
- 数据文档化等
这与 Pydantic 模型的工作方式相同。实际上,它在底层以相同的方式实现,使用 Pydantic。
Info
请记住,数据类不能做 Pydantic 模型能做的所有事情。
因此,你可能仍然需要使用 Pydantic 模型。
但如果你有一堆数据类闲置着,这是一个很好的技巧,可以用它们来驱动使用 FastAPI 的 Web API。🤓
在 response_model
中使用数据类¶
你也可以在 response_model
参数中使用 dataclasses
:
from dataclasses import dataclass, field
from typing import List, Union
from fastapi import FastAPI
@dataclass
class Item:
name: str
price: float
tags: List[str] = field(default_factory=list)
description: Union[str, None] = None
tax: Union[float, None] = None
app = FastAPI()
@app.get("/items/next", response_model=Item)
async def read_next_item():
return {
"name": "Island In The Moon",
"price": 12.99,
"description": "A place to be playin' and havin' fun",
"tags": ["breater"],
}
数据类将被自动转换为 Pydantic 数据类。
这样,它的模式将显示在 API 文档用户界面中:
在嵌套数据结构中使用数据类¶
你还可以将 dataclasses
与其他类型注解结合使用,以创建嵌套的数据结构。
在某些情况下,你可能仍然需要使用 Pydantic 版本的 dataclasses
。例如,如果你在自动生成的 API 文档中遇到错误。
在这种情况下,你可以简单地将标准 dataclasses
替换为 pydantic.dataclasses
,这是一个即插即用的替代品:
from dataclasses import field # (1)
from typing import List, Union
from fastapi import FastAPI
from pydantic.dataclasses import dataclass # (2)
@dataclass
class Item:
name: str
description: Union[str, None] = None
@dataclass
class Author:
name: str
items: List[Item] = field(default_factory=list) # (3)
app = FastAPI()
@app.post("/authors/{author_id}/items/", response_model=Author) # (4)
async def create_author_items(author_id: str, items: List[Item]): # (5)
return {"name": author_id, "items": items} # (6)
@app.get("/authors/", response_model=List[Author]) # (7)
def get_authors(): # (8)
return [ # (9)
{
"name": "Breaters",
"items": [
{
"name": "Island In The Moon",
"description": "A place to be playin' and havin' fun",
},
{"name": "Holy Buddies"},
],
},
{
"name": "System of an Up",
"items": [
{
"name": "Salt",
"description": "The kombucha mushroom people's favorite",
},
{"name": "Pad Thai"},
{
"name": "Lonely Night",
"description": "The mostests lonliest nightiest of allest",
},
],
},
]
-
我们仍然从标准
dataclasses
导入field
。 -
pydantic.dataclasses
是dataclasses
的即插即用替代品。 -
Author
数据类包含一个Item
数据类的列表。 -
Author
数据类被用作response_model
参数。 -
你可以将其他标准类型注解与数据类一起用作请求体。
在这种情况下,它是一个
Item
数据类的列表。 -
这里我们返回一个包含
items
的列表的词典。FastAPI 仍然能够将数据序列化为 JSON。
-
这里的
response_model
使用了一个Author
数据类列表的类型注解。同样,你可以将
dataclasses
与标准类型注解结合使用。 -
注意,这个 路径操作函数 使用的是常规的
def
而不是async def
。与往常一样,在 FastAPI 中,你可以根据需要结合使用
def
和async def
。如果你需要复习何时使用哪个,请查看文档中关于
async
和await
的部分。 -
这个 路径操作函数 没有返回数据类(尽管它可以),而是一个包含内部数据的字典列表。
FastAPI 将使用
response_model
参数(包含数据类)来转换响应。
你可以将 dataclasses
与其他类型注解以多种不同的组合方式结合使用,以形成复杂的数据结构。
查看上面的代码注解提示,了解更多具体细节。
了解更多¶
你还可以将 dataclasses
与其他 Pydantic 模型结合使用,继承它们,将它们包含在你自己的模型中,等等。
要了解更多信息,请查看 Pydantic 文档中关于数据类的部分。
版本¶
自 FastAPI 版本 0.67.0
起可用。🔖