Pydantic为具有嵌套字典的列表创建模型

2024-05-29 05:22:49 发布

您现在位置:Python中文网/ 问答频道 /正文

我的身体看起来像这样:

{
    "data": [
      {
        "my_api": {
          "label": "First name",
          "value": "Micheal"
        }
      },
      {
        "my_api": {
          "label": "Last name",
          "value": [
            "Jackson"
          ]
        }
      },
      {
        "my_api": {
          "label": "Favourite colour",
          "value": "I don't have any"
        }
      }
    ]
  }

这是我迄今为止的model.py

class DictParameter(BaseModel): # pylint: disable=R0903
    """
    `my_api` children
    """
    label: Optional[str]
    value: Optional[str]


class DataParameter(BaseModel): # pylint: disable=R0903
    """
    `data` children
    """
    my_api: Optional[dict]


class InputParameter(BaseModel): # pylint: disable=R0903
    """
    Takes predefined params
    """
    data: Optional[List[DataParameter]]

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 = user_input.data

    print(data)

输出:

[DataParameter(my_api={'label': 'First name', 'value': 'Micheal'}), DataParameter(my_api={'label': 'Last name', 'value': ['Jackson']}), DataParameter(my_api={'label': 'Favourite colour', 'value': "I don't have any"})]

我想访问my_api键内的值。但我一直收到类型错误。我不知道如何访问嵌套子项的字典列表。另外,value的值可以是strarray。它是动态的

还有别的方法吗


Tags: nameapidatavaluemyoptionallabelclass
1条回答
网友
1楼 · 发布于 2024-05-29 05:22:49

Plus, the value of value can be str or array. It is dynamic.

您当前拥有的将把单个元素列表强制转换为strs,这可能是您想要的。如果希望列表保持为列表,请使用:

from Typing import Union

class DictParameter(BaseModel):
    Value: Union[str, list[str]]

除非您幸运地运行了Python3.10,否则str | list[str]是等效的

但是,您实际上并不使用此模型!您有my_api: Optional[dict]而不是my_api: Optional[DictParameter],因此您当前的输出是一个普通的旧dict,您需要执行data[0].my_api["value"]。目前,这返回一个str或列表,这可能是问题所在。不过,我怀疑您是想使用pydantic模式

请注意,数据是一个列表:如果您想要迭代所有需要的值,请执行以下操作

apis = [x.my_api for x in data]

相关问题 更多 >

    热门问题