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

