FastAPI中使用Pydantic遇AttributeError:类对象无adId属性
解决Pydantic模型类方法访问字段的AttributeError问题
错误原因
你编写的generate_widget_item_dict是类方法(@classmethod修饰),在方法里直接通过cls.adId访问字段,但Pydantic模型的字段是实例属性,并非类属性。类本身不持有adId这个属性,因此调用时会抛出AttributeError: type object 'WidgetItem' has no attribute 'adId'。
解决方案
方案1:直接利用Pydantic内置方法生成字典
不需要自定义类方法,直接创建模型实例后调用model_dump()即可生成包含字段和对应值的字典:
from pydantic import BaseModel class WidgetItem(BaseModel): """Class for WidgetItem""" adId: str = '' # 生成含默认值的字典 default_widget_dict = WidgetItem().model_dump() print(default_widget_dict) # 输出: {'adId': ''}
方案2:修改类方法,通过实例访问属性
如果必须保留类方法,需要在方法内先创建模型实例,再访问实例的adId属性:
from pydantic import BaseModel class WidgetItem(BaseModel): """Class for WidgetItem""" adId: str = '' @classmethod def generate_widget_item_dict(cls): # 创建类实例,访问实例属性 instance = cls() return { 'adId': instance.adId } # 调用类方法 print(WidgetItem.generate_widget_item_dict()) # 输出: {'adId': ''}
方案3:支持传入参数的类方法
如果需要根据传入的参数生成对应字典,可以让类方法接收参数并创建带参数的实例:
from pydantic import BaseModel class WidgetItem(BaseModel): """Class for WidgetItem""" adId: str = '' @classmethod def generate_widget_item_dict(cls, ad_id: str = ''): instance = cls(adId=ad_id) return instance.model_dump() # 调用示例 print(WidgetItem.generate_widget_item_dict('ad_123')) # 输出: {'adId': 'ad_123'} print(WidgetItem.generate_widget_item_dict()) # 输出: {'adId': ''}
内容的提问来源于stack exchange,提问作者Mohamed Haydar
相关产品推荐
相关产品推荐

