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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 05:06:09