Pydantic根验证器无法访问类属性问题求助
Pydantic root_validator无法访问类属性的解决方法
问题原因
你代码里的description在BaseClass中是用类型注解定义的模型字段,Pydantic在构建模型类时,会将这类字段从类属性转移到模型的__fields__字典中,不再保留为类属性。所以直接通过cls.description访问时,会提示类没有该属性。另外SubClass中直接赋值description = "foo"的方式也不对,这不会把它保留为类属性,而是会被当作模型字段的默认值处理,但依然无法通过类直接访问。
解决方案
方案1:如果description是模型字段,从__fields__中获取默认值
把SubClass中字段的默认值设置正确,然后在root_validator里通过模型的__fields__字典访问字段的默认值:
from pydantic import BaseModel, root_validator from typing import Dict, Any class BaseClass(BaseModel): description: str @root_validator(pre=True) def initialize(cls, values: Dict[str, Any]) -> Dict[str, Any]: # 从模型字段配置中获取默认值 print(cls.__fields__['description'].default) return values class SubClass(BaseClass): # 正确定义模型字段的默认值 description: str = "foo"
方案2:如果description是类属性(非模型字段),用ClassVar标记
如果不需要description作为模型的实例字段,只是类属性,需要用ClassVar标记,避免被Pydantic当作模型字段处理:
from pydantic import BaseModel, root_validator from typing import Dict, Any, ClassVar class BaseClass(BaseModel): # 标记为类属性,不参与模型字段校验 description: ClassVar[str] @root_validator(pre=True) def initialize(cls, values: Dict[str, Any]) -> Dict[str, Any]: print(cls.description) return values class SubClass(BaseClass): description = "foo"
内容的提问来源于stack exchange,提问作者user3073511
相关产品推荐
相关产品推荐

