使用Pydantic RootModel与BaseModel时出现items属性缺失错误求助
问题解决:Pydantic RootModel与BaseModel结合遍历报错
问题原因
- 第一个错误
'DataJsonExec' object has no attribute 'items':DataJsonExec继承自RootModel,内部数据存储在.root属性中,直接调用实例的items()方法自然找不到,你已经通过request1 = request.request1.root解决了这个问题。 - 第二个错误
'FeatureConfig' object has no attribute 'items':遍历request1.items()时,process是FeatureConfig的实例(而非字典),BaseModel子类实例没有items()方法,因此触发报错。
解决方案
针对第二个错误,有两种常用解决方式:
方式1:将BaseModel实例转为字典
使用Pydantic的model_dump()方法把FeatureConfig实例转换成字典,之后就能用items()遍历所有字段:
@app.post("/json-exec") def execute_generated_json(request : JsonExecutionRequest): user_session_id = request.user_session_id table_name = request.table_name request1 = request.request1.root request2 = request.request2 for column_name, process in request1.items(): # 将FeatureConfig实例转为字典 process_dict = process.model_dump() for name, value in process_dict.items(): # 此处添加你的处理逻辑 print(f"{name}: {value}")
方式2:直接访问BaseModel的属性
因为FeatureConfig的结构是明确的(strategy和parameters两个字段),直接访问属性比转字典更高效:
@app.post("/json-exec") def execute_generated_json(request : JsonExecutionRequest): user_session_id = request.user_session_id table_name = request.table_name request1 = request.request1.root request2 = request.request2 for column_name, process in request1.items(): # 直接访问属性 strategy = process.strategy parameters = process.parameters # 此处添加你的处理逻辑 print(f"列名: {column_name}, 策略: {strategy}, 参数: {parameters}")
可选优化:简化模型定义
如果不需要RootModel的特殊功能,可以直接将request1定义为Dict[str, FeatureConfig],这样就不需要通过.root访问内部数据:
class JsonExecutionRequest(BaseModel): user_session_id : str = Field("xxx", description="user session id") table_name : str = Field("xxx", description="Name of the field") request1: Dict[str, FeatureConfig] # 直接用Dict类型替代RootModel request2: ModelReq
修改后可直接使用request.request1.items()遍历,无需额外处理。
内容的提问来源于stack exchange,提问作者Sanjith Kumar
相关产品推荐
相关产品推荐

