如何在Pydantic验证前为嵌套模型填充关联字典键值?
解决Pydantic嵌套模型验证前填充字段的问题
你可以通过Pydantic的**验证器配合mode='before'**实现这个需求,这类验证器会在模型验证流程启动前执行,刚好能在验证嵌套的UserType之前补全缺失的type字段。
方案1:模型级全局验证器
直接在父模型里定义全局验证器,提前处理objects字典的键值对:
from pydantic import BaseModel, model_validator from typing import Dict class UserType(BaseModel): type: str name: str class ParentModel(BaseModel): objects: Dict[str, UserType] @model_validator(mode='before') def fill_user_type(cls, values): objects = values.get('objects', {}) for key, user_data in objects.items(): if 'type' not in user_data: user_data['type'] = key values['objects'] = objects return values
方案2:字段级精准验证器
如果只需要针对objects字段处理,用字段验证器更聚焦:
from pydantic import BaseModel, field_validator from typing import Dict class UserType(BaseModel): type: str name: str class ParentModel(BaseModel): objects: Dict[str, UserType] @field_validator('objects', mode='before') def fill_user_type(cls, objects_data): for key, user_data in objects_data.items(): if 'type' not in user_data: user_data['type'] = key return objects_data
测试验证
运行以下代码,嵌套的UserType会自动补全type字段,不会触发验证失败:
test_data = { "objects": { "admin": {"name": "Alice"}, "user": {"name": "Bob"} } } model = ParentModel(**test_data) print(model.objects['admin'].type) # 输出: admin print(model.objects['user'].type) # 输出: user
为什么model_post_init不行?
model_post_init是在模型所有验证完成、实例创建之后才执行的方法,这时候嵌套的UserType早就因type字段缺失验证失败了,根本轮不到它补全字段。
内容的提问来源于stack exchange,提问作者piotrekkr
相关产品推荐
相关产品推荐

