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

