如何让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
相关产品推荐
相关产品推荐

