FastAPI集成Tortoise-ORM出现Score类无date属性AttributeError报错求解
问题根因
你错误地将数据库原生映射字段标记为了Pydantic计算属性:
在Score模型的PydanticMeta内部类中,你把date加入了computed列表。computed配置的作用是告诉Tortoise-ORM的Pydantic生成器:对应字段是你在模型类中手动实现的计算方法/动态属性,不是ORM映射的数据库字段,生成Pydantic模型时需要从模型类中获取对应方法来取值。
而你的date本身就是通过fields.DateField()定义的标准数据库字段,没有在类中实现同名方法,生成Pydantic模型时调用getattr(Score, 'date')找不到对应属性,就抛出了这个报错。
解决方案
删掉Score模型PydanticMeta中的computed = ['date']配置即可,标准数据库字段不需要加入computed列表。
如果你想把你实现的today_date方法作为计算属性暴露给Pydantic,才需要把today_date加入computed列表。
其他附带问题修复
你代码中还有几处错误需要同步调整,否则后续运行还会抛出异常:
Team模型的PydanticMeta里同样错误地将数据库字段total_score加入了computed列表,如果total_score是需要存储的字段,直接删掉这条computed配置即可;如果你想让总分自动根据历史得分计算不需要存储,就删掉total_score: int = fields.IntField()这行字段定义,然后新增def total_score(self)方法来实现计算逻辑,再保留computed = ['total_score']配置。- 你在
Team模型中调用了Sum函数但没有导入,需要新增导入语句from tortoise.functions import Sum。 - 新建Team的逻辑存在问题:
Team.create(**team.dict(), **score.dict())会把Score的score、date字段直接传入Team创建逻辑,而Team模型没有这两个字段,会报错。正确写法是先创建Team实例,再创建Score实例,然后把Score加入Team的score_history多对多关联中。
内容的提问来源于stack exchange,提问作者infinitEplus
相关产品推荐
相关产品推荐

