如何在Pydantic BaseModel子类中自动生成UUID?
解决Pydantic Error类的__pydantic_fields_set__属性错误
你的问题出在重写__init__方法时的初始化顺序错误——手动提前给实例属性赋值后再调用父类构造,干扰了Pydantic BaseModel的内部初始化流程,导致__pydantic_fields_set__这个Pydantic内部依赖的属性未被正确创建。
修复方案1:正确调用父类构造函数
不要手动提前给self.id和self.code赋值,直接将参数传递给父类的__init__方法,由BaseModel负责属性初始化和内部逻辑处理:
import uuid from pydantic import BaseModel class Error(BaseModel): id: uuid.UUID code: int def __init__(self, code: int) -> None: super().__init__(id=uuid.uuid4(), code=code)
修复方案2:使用Pydantic的default_factory(更推荐)
完全不需要重写__init__,通过Field的default_factory让Pydantic自动生成UUID,更符合框架设计规范,代码也更简洁:
import uuid from pydantic import BaseModel, Field class Error(BaseModel): id: uuid.UUID = Field(default_factory=uuid.uuid4) code: int # 使用示例 error_instance = Error(code=400)
这样创建Error实例时只需传入code,id会自动由uuid.uuid4()生成,完全避免冗余代码。
内容的提问来源于stack exchange,提问作者oblio
相关产品推荐
相关产品推荐

