Flaskadmin没有强制外键约束

2024-04-27 03:04:25 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个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管理模块执行引用完整性

管理员视图

^{pr2}$

添加视图

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设置。我想真正执行诚信的意义上,他们应该仍然可以删除它,只要没有任何联系


Tags: viewaddidtrueflaskadminsqlalchemysession
1条回答
网友
1楼 · 发布于 2024-04-27 03:04:25

看起来好像

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

是问题所在。似乎是backref将此表视为父类,导致了多对多关系,而实际上我想要的是多对一关系。正在将行更新为

workgroup = relationship('Workgroup')

似乎支持诚信如预期

相关问题 更多 >