与使用 QueryPathBody 在路径操作函数中声明额外的校验和元数据的方式相同,你可以使用 Pydantic 的 Field 在 Pydantic 模型内部声明校验和元数据。

导入 Field

首先,你必须导入它:

  1. from typing import Optional
  2. from fastapi import Body, FastAPI
  3. from pydantic import BaseModel, Field
  4. app = FastAPI()
  5. class Item(BaseModel):
  6. name: str
  7. description: Optional[str] = Field(
  8. None, title="The description of the item", max_length=300
  9. )
  10. price: float = Field(..., gt=0, description="The price must be greater than zero")
  11. tax: Optional[float] = None
  12. @app.put("/items/{item_id}")
  13. async def update_item(item_id: int, item: Item = Body(..., embed=True)):
  14. results = {"item_id": item_id, "item": item}
  15. return results


:::tips 注意,Field 是直接从 pydantic 导入的,而不是像其他的(QueryPathBody 等)都从 fastapi 导入。 :::

声明模型属性

然后,你可以对模型属性使用 Field

  1. from typing import Optional
  2. from fastapi import Body, FastAPI
  3. from pydantic import BaseModel, Field
  4. app = FastAPI()
  5. class Item(BaseModel):
  6. name: str
  7. description: Optional[str] = Field(
  8. None, title="The description of the item", max_length=300
  9. )
  10. price: float = Field(..., gt=0, description="The price must be greater than zero")
  11. tax: Optional[float] = None
  12. @app.put("/items/{item_id}")
  13. async def update_item(item_id: int, item: Item = Body(..., embed=True)):
  14. results = {"item_id": item_id, "item": item}
  15. return results

Field 的工作方式和 QueryPathBody 相同,包括它们的参数等等也完全相同。

:::info 实际上,QueryPath 和其他你将在之后看到的类,创建的是由一个共同的 Params 类派生的子类的对象,该共同类本身又是 Pydantic 的 FieldInfo 类的子类。
Pydantic 的 Field 也会返回一个 FieldInfo 的实例。
Body 也直接返回 FieldInfo 的一个子类的对象。还有其他一些你之后会看到的类是 Body 类的子类。
请记住当你从 fastapi 导入 QueryPath 等对象时,他们实际上是返回特殊类的函数。 :::
:::tips 注意每个模型属性如何使用类型、默认值和 Field 在代码结构上和路径操作函数的参数是相同的,区别是用 Field 替换PathQueryBody。 :::

添加额外信息

你可以在 FieldQueryBody 中声明额外的信息。这些信息将包含在生成的 JSON Schema 中。
你将在文档的后面部分学习声明示例时,了解到更多有关添加额外信息的知识。

总结

你可以使用 Pydantic 的 Field 为模型属性声明额外的校验和元数据。
你还可以使用额外的关键字参数来传递额外的 JSON Schema 元数据。