什么是嵌套模型

嵌套模型是指在一个模型中包含另一个模型,用于表示复杂的数据结构

嵌套模型

Pydantic 模型的属性可以是其他 Pydantic 模型,支持深度嵌套的 JSON 对象,且可以对属性的名称、类型和校验进行灵活定义

class Address(BaseModel):
    street: str
    city: str
    state: str
    zip_code: str

class User(BaseModel):
    name: str
    age: int
    address: Address

@app.post("/users/")
async def create_user(user: User):
    return user

如上,我们定义了一个 Address 模型,被作为另一个 Pydantic 模型 Useraddress 属性的类型

在实际请求时,我们按照以下格式发送请求体即可

{
  "name": "John Doe",
  "age": 30,
  "address": {
    "street": "123 Main St",
    "city": "Anytown",
    "state": "CA",
    "zip_code": "12345"
  }
}

嵌套模型的校验

嵌套模型同样支持数据校验

class OrderItem(BaseModel):
    name: str
    quantity: int = Field(..., gt=0)
    price: float = Field(..., gt=0)


class Order(BaseModel):
    items: List[OrderItem]
    total: float = Field(..., gt=0)


@app.post("/orders/")
async def create_order(order: Order):
    return order

示例请求:
合法:{"items": [{"name": "Laptop", "quantity": 1, "price": 999.99}], "total": 999.99} → 返回订单信息
非法:{"items": [{"name": "Laptop", "quantity": 0, "price": 999.99}], "total": 999.99} → 422 错误

特殊的类型和校验

除了标准库类型,如strintfloat 等,还可声明更复杂的类型,比如 网络类型等

from pydantic import HttpUrl
​
class Image(BaseModel):
    url: HttpUrl
    name: str

上例中 url 被声明为 HttpUrl 类型,可以接受任何 http 或 https URL 的类型数据,Pydantic 支持自定义类型和校验,更多参考 Pydantic Types

最后修改:2025 年 06 月 03 日
如果觉得我的文章对你有用,请随意赞赏