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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 09:45:35