8_请求体-字段
与使用 Query
、Path
和 Body
在路径操作函数中声明额外的校验和元数据的方式相同,你可以使用 Pydantic 的 Field
在 Pydantic 模型内部为属性字段声明校验和元数据。
1. 导入Field:
from pydantic import BaeModel, Field
注意:Field
是从 Pydantic 导入的,而不是像 Query
, Path
和Body
等从 FastAPI 导入。
2. 声明模型属性:
我们可以对模型中的属性使用 Field
:
from fastapi import Body, FastAPI
from pydantic import BaseModel, Field
app = FastAPI()
class Item(BaseModel):
name: str
# 使用Field为属性字段添加校验和元数据
description: str | None = Field(
default=None, title="The description of the item", max_length=300
)
price: float = Field(gt=0, description="The price must be greater than zero")
tax: float | None = None
@app.put("/items/{item_id}")
async def update_item(item_id: int, item: Item = Body(embed=True)):
results = {"item_id": item_id, "item": item}
return results
Field
的工作方式和Query
, Path
和Body
等相同,包括他们的参数等等也完全相同。
技术细节:
实际上,Query
、Path
和其他你将在之后看到的类,创建的是由一个共同的 Params
类派生的子类的对象,该共同类本身又是 Pydantic 的 FieldInfo
类的子类。
Pydantic 的 Field
也会返回一个 FieldInfo
的实例。
Body
也直接返回 FieldInfo
的一个子类的对象。还有其他一些你之后会看到的类是 Body
类的子类。
请记住当你从 fastapi 导入 Query
、Path
等对象时,他们实际上是返回特殊类的函数(工厂函数)。
提示:
注意每个模型属性如何使用类型、默认值和 Field
在代码结构上和路径操作函数的参数是相同的,区别是用 Field
替换Path
、Query
和 Body
。
3. 添加额外信息:
我们可以在 Field
、Query
、Body
中声明额外的信息。这些信息将包含在生成的 JSON Schema 中。
在文档的后面部分学习声明示例时,会了解到更多有关添加额外信息的知识。
总结:
我们可以使用 Pydantic 提供的 Field
为模型属性声明额外的校验和元数据。
还可以使用额外的关键字参数来传递额外的 JSON Schema 元数据。