Flask AppBuilder如何用现有模型创建新记录存入DB 解决AttributeError报错
问题排查与解决方案
错误根因
你的代码存在两个核心错误,共同触发了该异常:
- 混淆了Flask AppBuilder的
ModelView和SQLAlchemy模型类的用法:你直接调用了ModelView类B的add方法,该方法是视图层用于处理用户新增请求的实例方法,内部会做权限校验,要求传入对应模型实例,你传入了A表的模型实例触发了权限属性检查,找不到method_permission_name属性从而报错。 - 新建对象的类型错误:
item是A表模型的实例,item.__class__()生成的还是A表模型的实例,和B表结构不匹配,根本无法写入B表。
修复方案
直接通过SQLAlchemy标准操作来写入B表即可,不需要调用ModelView的相关方法,修改后的action代码如下:
# 提前导入你的SQLAlchemy实例db和B表对应的模型类Table_B @action("mularchive", "Archive", "Archive all Really?", "fa-rocket", single=False) def mularchive(self, items): self.update_redirect() for item in items: # 实例化B表对应的模型类 new_b_item = Table_B() # 按需复制字段,有其他需要同步的字段可以继续补充赋值 new_b_item.name = item.name db.session.add(new_b_item) # 批量提交所有新增数据,优化性能 db.session.commit() return redirect(self.get_redirect())
如果你不想直接操作db.session,也可以通过datamodel接口来操作:
from app import db # 替换为你实际的db实例导入路径 from your_models_module import Table_B # 替换为你实际的Table_B导入路径 @action("mularchive", "Archive", "Archive all Really?", "fa-rocket", single=False) def mularchive(self, items): self.update_redirect() b_datamodel = SQLAInterface(Table_B) for item in items: new_b_item = Table_B() new_b_item.name = item.name b_datamodel.add(new_b_item, commit=False) db.session.commit() return redirect(self.get_redirect())
内容的提问来源于stack exchange,提问作者CD-Key
相关产品推荐
相关产品推荐

