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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 04:39:01