如何自定义Pydantic模型的dict()方法输出格式?
解决方法
方法一:重写dict()方法(Pydantic v1)
直接在Role类里重写dict()方法,自定义输出结构:
import pydantic class RoleBaseClass(pydantic.BaseModel): name: str = pydantic.Field(regex=r"^\w+$") class SubRole(RoleBaseClass): ... class Role(RoleBaseClass): subroles: list[SubRole] = pydantic.Field(default=[]) def dict(self, **kwargs): # 提取子角色的name字段组成列表 subrole_names = [sub.name for sub in self.subroles] # 返回目标精简结构 return {self.name: subrole_names}
测试代码:
role1 = Role(name="role1", subroles=[SubRole(name="sub1")]) print(role1.dict()) # 输出: {"role1": ["sub1"]}
方法二:适配Pydantic v2的model_dump()方法
如果使用Pydantic v2,官方推荐用model_dump()替代dict(),重写该方法即可:
from pydantic import BaseModel, Field class RoleBaseClass(BaseModel): name: str = Field(regex=r"^\w+$") class SubRole(RoleBaseClass): ... class Role(RoleBaseClass): subroles: list[SubRole] = Field(default=[]) def model_dump(self, **kwargs): subrole_names = [sub.name for sub in self.subroles] return {self.name: subrole_names}
执行测试后同样能得到目标输出。
方法三:自定义序列化方法(保留原有dict()行为)
如果不想改动默认dict()的输出,可以新增一个自定义方法实现需求:
class Role(RoleBaseClass): subroles: list[SubRole] = pydantic.Field(default=[]) def to_simple_dict(self): return {self.name: [sub.name for sub in self.subroles]}
调用时使用role1.to_simple_dict()就能获取精简结构。
内容的提问来源于stack exchange,提问作者DDStackoverflow
相关产品推荐
相关产品推荐

