本文目录导读:

是的,Pydantic 支持嵌套模型的递归验证,让我通过几个例子来说明:
基本嵌套模型验证
from pydantic import BaseModel
from typing import List, Optional
class Address(BaseModel):
street: str
city: str
zip_code: str
class User(BaseModel):
name: str
age: int
address: Address # 嵌套模型
# 验证时会递归验证 Address
user = User(
name="Alice",
age=30,
address={
"street": "123 Main St",
"city": "Beijing",
"zip_code": "100000"
}
)
print(user)
# name='Alice' age=30 address=Address(street='123 Main St', city='Beijing', zip_code='100000')
深度递归验证
class Department(BaseModel):
name: str
manager: Optional['Department'] = None # 自引用递归
employees: List['Employee'] = [] # 循环引用
class Employee(BaseModel):
name: str
department: Optional['Department'] = None
# 解决前向引用问题
Department.model_rebuild()
Employee.model_rebuild()
# 构建复杂嵌套结构
dept = Department(
name="Engineering",
employees=[
Employee(name="Bob"),
Employee(name="Charlie")
]
)
print(dept.model_dump())
嵌套列表和字典
class Item(BaseModel):
name: str
price: float
class Order(BaseModel):
order_id: int
items: List[Item] # 嵌套列表
metadata: dict[str, Item] = {} # 嵌套字典
# 验证嵌套结构
order = Order(
order_id=1,
items=[
{"name": "Book", "price": 29.99},
{"name": "Pen", "price": 1.99}
],
metadata={
"special": {"name": "Gift Box", "price": 5.99}
}
)
递归验证与错误处理
try:
# 错误的嵌套数据
user = User(
name="Bob",
age=25,
address={
"street": "456 Oak St",
"city": "Shanghai"
# 缺少 zip_code
}
)
except Exception as e:
print(e)
# 1 validation error for User
# address -> zip_code
# Field required [type=missing, ...]
复杂嵌套验证示例
from datetime import datetime
from typing import Optional
class Comment(BaseModel):
id: int
text: str
author: str
created_at: datetime
replies: List['Comment'] = [] # 递归嵌套
class Post(BaseModel):
id: int str
content: str
tags: List[str]
comments: List[Comment] # 多层嵌套
# 构建多层嵌套数据
post = Post(
id=1,"Pydantic Guide",
content="...",
tags=["python", "validation"],
comments=[
{
"id": 1,
"text": "Great article!",
"author": "Alice",
"created_at": "2024-01-01T10:00:00",
"replies": [
{
"id": 2,
"text": "Thanks!",
"author": "Author",
"created_at": "2024-01-01T11:00:00",
"replies": []
}
]
}
]
)
性能注意事项
对于非常深层的递归嵌套,Pydantic 会进行全量验证,这可能会影响性能:
# 深度递归时谨慎使用
class DeepNode(BaseModel):
value: int
children: List['DeepNode'] = []
# 设置递归深度限制
from pydantic import field_validator
class SafeNode(BaseModel):
value: int
children: List['SafeNode'] = []
_depth: int = 0
@field_validator('children')
@classmethod
def limit_depth(cls, v, info):
if info.data.get('_depth', 0) > 100: # 设置深度限制
raise ValueError('Maximum depth exceeded')
return v
Pydantic 确实支持递归嵌套模型验证:
- ✅ 自动递归验证嵌套模型
- ✅ 支持自引用和循环引用
- ✅ 支持嵌套列表、字典等容器
- ✅ 提供详细的错误信息
- ⚠️ 注意深度递归可能影响性能
使用 model_dump() 和 model_validate() 时也会递归处理嵌套结构。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播