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

如何让Pydantic模型属性兼容字典/列表输入,序列化统一输出列表?

解决方案

要实现输入兼容单个字典/对象或列表,序列化统一输出列表的需求,你可以通过Pydantic的字段验证器(Validator)在数据解析阶段就将单个对象转换为列表存储,这样后续调用dict()序列化时自然会输出列表格式。

针对Pydantic v2的实现

from typing import Union, List
from pydantic import CustomBaseModel, field_validator

class MessageInfo(CustomBaseModel):
    completion_code: int = None
    code: str = None
    message: str = None
    severity: str = None

class OrderResponseMessageInfo(CustomBaseModel):
    message_info: Union[List[MessageInfo], MessageInfo] = None

    @field_validator('message_info', mode='before')
    def convert_to_list(cls, value):
        # 处理None的情况,返回空列表(可根据需求调整)
        if value is None:
            return []
        # 如果输入不是列表,将其包装为单元素列表
        if not isinstance(value, list):
            return [value]
        # 已经是列表则直接返回
        return value

针对Pydantic v1的实现

如果你仍在使用Pydantic v1,只需调整验证器的写法:

from typing import Union, List
from pydantic import CustomBaseModel, validator

class MessageInfo(CustomBaseModel):
    completion_code: int = None
    code: str = None
    message: str = None
    severity: str = None

class OrderResponseMessageInfo(CustomBaseModel):
    message_info: Union[List[MessageInfo], MessageInfo] = None

    @validator('message_info', pre=True)
    def convert_to_list(cls, value):
        if value is None:
            return []
        if not isinstance(value, list):
            return [value]
        return value

原理说明

  • mode='before'(v1中对应pre=True)表示验证器会在Pydantic解析字段数据之前执行,确保单个对象先被转为列表,再由Pydantic自动解析为List[MessageInfo]类型。
  • 不管API返回的是单个字典还是字典列表,经过验证器处理后,message_info字段内部都会以列表形式存储,调用OrderResponseMessageInfo.dict()时自然输出列表格式。

内容的提问来源于stack exchange,提问作者Vishal Thakur

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 03:22:49