什么是嵌套模型
嵌套模型是指在一个模型中包含另一个模型,用于表示复杂的数据结构
嵌套模型
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 模型 User
中 address
属性的类型
在实际请求时,我们按照以下格式发送请求体即可
{
"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 错误
特殊的类型和校验
除了标准库类型,如str
、int
、float
等,还可声明更复杂的类型,比如 网络类型等
from pydantic import HttpUrl
class Image(BaseModel):
url: HttpUrl
name: str
上例中 url 被声明为 HttpUrl 类型,可以接受任何 http 或 https URL 的类型数据,Pydantic 支持自定义类型和校验,更多参考 Pydantic Types。