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

如何在Pydantic模型初始化后执行函数生成哈希ID?

解决方案

方法1:使用字段验证器(Pydantic v2)

通过@field_validator在id字段验证完成后自动生成hashed_id,确保在模型初始化和验证阶段就完成哈希值生成:

from pydantic import BaseModel, field_validator
from typing import Any

# 替换为你实际的哈希编码逻辑
def encode(num: int) -> str:
    return f"SkaHGA_{num}"

class MySchema(BaseModel):
    id: int
    hashed_id: str | None = None

    @field_validator("id")
    def generate_hashed_id(cls, v, values):
        values.data["hashed_id"] = encode(v)
        return v

测试示例:

instance = MySchema(id=10)
print(instance.model_dump())

输出结果:

{
  "id": 10,
  "hashed_id": "SkaHGA_10"
}

方法2:使用计算字段(Pydantic v2.2+)

如果hashed_id完全依赖id字段,可将其定义为计算字段,无需手动初始化,更贴合Pydantic设计逻辑:

from pydantic import BaseModel, computed_field
from typing import Any

def encode(num: int) -> str:
    return f"SkaHGA_{num}"

class MySchema(BaseModel):
    id: int

    @computed_field
    @property
    def hashed_id(self) -> str:
        return encode(self.id)

该方式下,hashed_id会随id值自动生成,序列化时直接输出计算结果。

原代码失效原因

原代码在__init__中手动修改hashed_id,但Pydantic的BaseModel初始化流程中,父类__init__会先完成字段的验证与赋值,后续手动修改的字段值可能在序列化环节未被正确识别,或在模型重新验证时被覆盖。使用Pydantic原生的验证器或计算字段,能更好地融入其生命周期,确保字段值的稳定性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 00:02:17