如何在Pydantic模型中基于其他字段的取值为字段设置默认值
实现方案
你预期的写法无法直接生效,原因是default_factory执行时实例尚未完成初始化,self对象还不存在,无法直接读取其他字段的值。根据你的需求可以选择以下两种实现方式:
方案1:允许手动传入address覆盖默认值
适合需要支持自定义address的场景,Pydantic 2.x 实现如下:
from pydantic import BaseModel, Field, model_validator import key class Wallet(BaseModel): private_key: str = Field(default_factory=key.generate_private_key) # 先设为可选,默认None,后续校验逻辑自动生成 address: str | None = None @model_validator(mode='after') def generate_default_address(self): if self.address is None: self.address = key.generate_address(self.private_key) return self
如果使用的是Pydantic 1.x版本,改用validator实现:
from pydantic import BaseModel, Field, validator import key class Wallet(BaseModel): private_key: str = Field(default_factory=key.generate_private_key) address: str = None @validator('address', always=True) def fill_address(cls, v, values): if v is None: if 'private_key' not in values: raise ValueError('私钥生成失败,无法计算对应地址') return key.generate_address(values['private_key']) return v
方案2:address完全由private_key计算生成,不允许手动传入
如果不需要支持自定义address,优先用computed_field实现,逻辑更安全,地址会自动跟随私钥变化:
from pydantic import BaseModel, Field, computed_field import key class Wallet(BaseModel): private_key: str = Field(default_factory=key.generate_private_key) @computed_field @property def address(self) -> str: return key.generate_address(self.private_key)
内容的提问来源于stack exchange,提问作者KOB
相关产品推荐
相关产品推荐

