如何在Pydantic中将对象列表序列化为以Item的ID为键的字典?
Pydantic实现Item对象转uid为键的字典
方案一:自定义model_dump方法
让ResponseModel继承BaseModel,重写序列化方法直接生成目标结构:
from uuid import UUID, uuid4 from datetime import datetime from pydantic import BaseModel, Field def datetime_now(): return datetime.now() class Item(BaseModel): uid: UUID = Field(default_factory=uuid4) updated: datetime = Field(default_factory=datetime_now) # 补充其他字段 class ResponseModel(BaseModel): items: list[Item] def model_dump(self, **kwargs): # 将Item列表转换为以uid字符串为键的字典 return {str(item.uid): item.model_dump(**kwargs) for item in self.items} # 测试代码 item1 = Item() item2 = Item() response = ResponseModel(items=[item1, item2]) print(response.model_dump())
方案二:使用计算字段(Pydantic v2+)
利用Pydantic v2的computed_field特性,生成目标映射字段:
from pydantic import computed_field class ResponseModel(BaseModel): items: list[Item] @computed_field(return_type=dict[str, Item]) def items_by_uid(self) -> dict[str, Item]: return {str(item.uid): item for item in self.items} # 序列化时指定输出计算字段 response = ResponseModel(items=[item1, item2]) print(response.model_dump(include={"items_by_uid"}))
关键提示
- Python字典不支持UUID类型作为键,必须将
uid转为字符串 - 若用于FastAPI等API框架,直接返回序列化后的结果即可,客户端将获得便于按uid访问的键值对结构
内容的提问来源于stack exchange,提问作者tback
相关产品推荐
相关产品推荐

