跳到内容

Body - Fields

正如您可以使用 QueryPathBody路径操作函数参数中声明额外的校验和元数据一样,您也可以使用 Pydantic 的 Field 在 Pydantic 模型内部声明校验和元数据。

导入 Field

首先,您必须导入它

from typing import Annotated

from fastapi import Body, FastAPI
from pydantic import BaseModel, Field

app = FastAPI()


class Item(BaseModel):
    name: str
    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: Annotated[Item, Body(embed=True)]):
    results = {"item_id": item_id, "item": item}
    return results
🤓 其他版本和变体

提示

如果可能,请优先使用 Annotated 版本。

from fastapi import Body, FastAPI
from pydantic import BaseModel, Field

app = FastAPI()


class Item(BaseModel):
    name: str
    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 是直接从 pydantic 导入的,而不是像其他所有工具(QueryPathBody 等)那样从 fastapi 导入的。

声明模型属性

然后,您可以在模型属性中使用 Field

from typing import Annotated

from fastapi import Body, FastAPI
from pydantic import BaseModel, Field

app = FastAPI()


class Item(BaseModel):
    name: str
    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: Annotated[Item, Body(embed=True)]):
    results = {"item_id": item_id, "item": item}
    return results
🤓 其他版本和变体

提示

如果可能,请优先使用 Annotated 版本。

from fastapi import Body, FastAPI
from pydantic import BaseModel, Field

app = FastAPI()


class Item(BaseModel):
    name: str
    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 的工作方式与 QueryPathBody 相同,它拥有完全相同的参数等。

技术细节

事实上,您稍后会看到的 QueryPath 等,它们创建的是通用 Param 类的子类对象,而 Param 类本身又是 Pydantic FieldInfo 类的子类。

同时,Pydantic 的 Field 返回的也是一个 FieldInfo 实例。

Body 也直接返回 FieldInfo 子类的对象。您稍后还会看到其他属于 Body 类子类的组件。

请记住,当您从 fastapi 导入 QueryPath 等时,它们实际上是返回特殊类的函数。

提示

请注意,每个带有类型、默认值和 Field 的模型属性,其结构与路径操作函数的参数结构是一样的,只是用 Field 替换了 PathQueryBody

添加额外信息

您可以在 FieldQueryBody 等中声明额外信息。这些信息将被包含在生成的 JSON Schema 中。

在后续文档中学习声明示例时,您将了解更多关于添加额外信息的知识。

警告

传递给 Field 的额外键也将出现在应用程序生成的 OpenAPI schema 中。由于这些键未必是 OpenAPI 规范的一部分,某些 OpenAPI 工具(例如 OpenAPI 验证器)可能无法处理您生成的 schema。

总结

您可以使用 Pydantic 的 Field 为模型属性声明额外的校验和元数据。

您还可以使用额外的关键字参数来传递附加的 JSON Schema 元数据。