如何使用Pydantic定义嵌套列表字典模型并访问动态类型value字段
解决方案
1. 修正Pydantic模型定义
你当前的核心问题有两个:
DataParameter中把my_api定义为dict类型,Pydantic不会自动把字典解析为你预先定义的DictParameter实例,因此无法通过点语法访问字段DictParameter中的value仅定义了str类型,和实际请求中可能出现的数组类型不匹配
修改后的model.py代码如下:
from typing import Optional, List, Union from pydantic import BaseModel class DictParameter(BaseModel): # pylint: disable=R0903 """ `my_api` children """ label: Optional[str] # 支持str和字符串数组两种类型 value: Optional[Union[str, List[str]]] class DataParameter(BaseModel): # pylint: disable=R0903 """ `data` children """ # 这里替换为DictParameter类型,不要用dict my_api: Optional[DictParameter] class InputParameter(BaseModel): # pylint: disable=R0903 """ Takes predefined params """ data: Optional[List[DataParameter]]
2. 嵌套字段访问方式
修改模型后,就可以直接通过点语法逐层访问字段,同时可以通过类型判断处理动态类型的value,main.py的参考代码如下:
from model import InputParameter @router.post("/v2/workflow", status_code=200) def get_parameter(user_input: InputParameter): """ Version 2 : No decoding & retrieve workflow params """ data_list = user_input.data if not data_list: return for item in data_list: my_api = item.my_api if not my_api: continue # 直接访问label字段 label = my_api.label # 获取动态类型的value value = my_api.value # 根据value类型做不同处理 if isinstance(value, str): print(f"标签{label}的字符串值:{value}") elif isinstance(value, list): print(f"标签{label}的数组值:{','.join(value)}")
补充说明
如果使用Python 3.10及以上版本,Union[str, List[str]]可以简化为str | List[str],写法更简洁。
内容的提问来源于stack exchange,提问作者user6308605
相关产品推荐
相关产品推荐

