【问题标题】:Pydantic create model for list with nested dictionaryPydantic 为带有嵌套字典的列表创建模型
【发布时间】:2021-11-26 09:45:30
【问题描述】:

我的身体是这样的:

{
    "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。它是动态的。

还有其他方法吗?

【问题讨论】:

    标签: python fastapi pydantic


    【解决方案1】:

    另外,value 的值可以是 str 或 array。它是动态的。

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

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

    除非你有幸运行 python 3.10,在这种情况下str | list[str] 是等效的。

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

    注意 data 是一个列表:如果你想要所有需要迭代的值,比如

    apis = [x.my_api for x in data]
    

    【讨论】:

      猜你喜欢
      • 2022-11-01
      • 2018-01-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-04
      • 1970-01-01
      • 2021-11-20
      相关资源
      最近更新 更多