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

Pydantic中子类如何重写父类字段别名实现输出字段重命名

Pydantic继承模型修改字段输出别名解决方案

你可以通过给继承的字段设置别名+调整序列化配置实现需求,不同Pydantic版本实现方式略有差异:

Pydantic V2 实现

V2版本推荐直接通过ConfigDict配置默认序列化使用别名,无需每次手动传参:

from pydantic import BaseModel, Field, ConfigDict
from typing import List

class Model1(BaseModel):
    names: List[str]

class Model2(Model1):
    # 重写继承来的names字段,设置别名
    names: List[str] = Field(alias="firstnames")
    model_config = ConfigDict(
        # 支持用原字段名names传值初始化
        populate_by_name=True,
        # 序列化默认使用别名输出
        serialize_by_alias=True
    )

data = { "names": ["rodrigo", "julien", "matthew", "bob"] }
# Model1(**data).model_dump()  -> 输出 {'names': ['rodrigo', 'julien', 'matthew', 'bob']}
# Model2(**data).model_dump()  -> 输出 {'firstnames':  ['rodrigo', 'julien', 'matthew', 'bob']}

注:Pydantic V2中旧的dict()方法已废弃,推荐使用model_dump()做序列化,如果你仍要使用dict(),可以手动传入by_alias=True参数实现别名输出:Model2(**data).dict(by_alias=True)

Pydantic V1 实现

V1版本可以通过重写dict()方法实现默认输出别名:

from pydantic import BaseModel, Field
from typing import List

class Model1(BaseModel):
    names: List[str]

class Model2(Model1):
    names: List[str] = Field(alias="firstnames")
    
    class Config:
        # 支持用原字段名names传值初始化
        allow_population_by_field_name = True
    
    # 重写dict方法,默认使用别名输出
    def dict(self, *args, **kwargs):
        kwargs.setdefault("by_alias", True)
        return super().dict(*args, **kwargs)

data = { "names": ["rodrigo", "julien", "matthew", "bob"] }
# Model1(**data).dict()  -> 输出 {'names': ['rodrigo', 'julien', 'matthew', 'bob']}
# Model2(**data).dict()  -> 输出 {'firstnames':  ['rodrigo', 'julien', 'matthew', 'bob']}

内容的提问来源于stack exchange,提问作者Luc Bertin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 09:42:02