You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 06:45:04