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

如何自定义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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 01:27:07