python - Flask-admin 不强制执行外键约束

标签 python mysql flask sqlalchemy flask-admin

我有一个 Flask 项目,使用 sqlalchemy 独立模式,该模式不是为 Flask 项目编码的(因此仅使用纯 SQLAlchemy)

代码片段

class Drive(Base):
    """
    A drive in an edit station.
    """
    __tablename__ = 'drives'

    id = sqlalchemy.Column(sqlalchemy.Integer,
                           primary_key=True,
                           autoincrement=True
                           )
    name = sqlalchemy.Column(sqlalchemy.String(64))
    computer_id = sqlalchemy.Column(sqlalchemy.Integer,
                                    sqlalchemy.ForeignKey(Computer.id)
                                    )
    computer = relationship('Computer', backref='drives')
    # .......... more attr
    current_workgroup_id = sqlalchemy.Column(sqlalchemy.Integer,
                                             sqlalchemy.ForeignKey(Workgroup.id),
                                             nullable=False
                                             )
    workgroup = relationship('Workgroup', backref='drives')


class Workgroup(Base):
    """
    A workgroup.
    """
    __tablename__ = 'workgroups'
    id = sqlalchemy.Column(sqlalchemy.Integer,

                           primary_key=True,
                           autoincrement=True
                           )
    name = sqlalchemy.Column(sqlalchemy.String(16))
    shorthand = sqlalchemy.Column(sqlalchemy.String(4))

数据库架构在 MySQL 中运行良好。如果我有一个带有工作组的驱动器,我无法删除该工作组 enter image description here

但是,当使用flask-admin时,它没有这样的强制。我删除了 workgroup 记录,并且 drive.workgroup 更新为空值。我不知道如何让 Flask-Admin 模块强制引用完整性,

管理 View

class DriveAdmin(sqla.ModelView):
    column_auto_select_related = True
    column_display_pk = True
    column_hide_backrefs = False
    column_display_all_relations = True
    column_searchable_list = ('computer.name', 'name', 'workgroup.name')
    #form_columns = ['computer', 'name', 'workgroup', 'is_active']
    column_list = ('computer', 'name', 'workgroup', 'computer.short_description', 'computer.notes',
                   'computer.station_type.description', 'computer.room.name', 'is_active')


class WorkgroupAdmin(sqla.ModelView):
    column_auto_select_related = True
    column_display_pk = True # optional, but I like to see the IDs in the list
    column_hide_backrefs = True
    column_list = ('id', 'name', 'shorthand')

添加 View

admin = Admin(app, name='Admin Section', template_mode='bootstrap3')
temp_session = EditSession(bind=edit_engine)

admin.add_view(my_admin.ComputerAdmin(Computer, temp_session))
admin.add_view(my_admin.DriveAdmin(Drive, temp_session))
admin.add_view(my_admin.RoomAdmin(Room, temp_session))
admin.add_view(my_admin.WorkgroupAdmin(Workgroup, temp_session))

大多数column_* = True/False都是我试图弄清楚这一点-_-

编辑:我不是在寻找 can_delete 设置。我想真正加强完整性,因为只要没有任何链接,他们仍然应该能够删除它

最佳答案

看起来好像

workgroup = relationship('Workgroup', backref='drives')

是问题所在。似乎 backref 导致该表被视为父类,从而导致多对多关系,其中事实上我想要多对一关系。将行更新为

工作组 = 关系('工作组')

似乎按照预期支持了完整性

关于python - Flask-admin 不强制执行外键约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33758716/

相关文章:

Python:无法访问通过多处理更改的内存

python - 异步事件循环如何知道等待资源何时准备就绪?

java - 如何在 JDBC 对象中使用变量? Jmeter

amazon-web-services - 无法通过来自 Python Elastic Beanstalk 的 Flask SQLAlchemy URI 连接到 AWS MySQL RDS 实例

Python:找到最小的整数

python - 计算泊松概率百分比

MySQL查询——2组条件

MySQL最大数据包错误centOS 6.3

python - uWSGI kill 问题

python - AADSTS50011 : The reply URL specified in the request does not match the reply URLs configured for the application. 如何指定重定向 URI?