在Flask中删除一对一关系

2 投票
1 回答
1068 浏览
提问于 2025-04-18 14:51

我现在正在用Flask开发一个应用程序,但在处理一对一关系时遇到了一个大问题,想要删除某些项目。我的模型结构是这样的:

class User(db.Model):
   __tablename__ = 'user'
   user_id = db.Column(db.String(8), primary_key = True)
   password = db.Column(db.String(26))

class Student(db.Model):
   __tablename__ = 'student'
   user_id = Column(db.String(8), ForeignKey('user.user_id'), primary_key = True)
   user = db.relationship('User')

class Professor(db.Model):
   __tablename__ = 'professor'
   user_id = Column(db.String(8), ForeignKey('user.user_id'), primary_key = True)
   user = db.relationship('User')

我想要实现的是,如果我删除用户,就同时删除学生或教授。我尝试用下面的代码进行测试,但当我查看数据库时,发现学生和教授仍然存在,而且我的测试也没有通过。我尝试在设置关系时加入级联删除的参数,但没有效果。我在网上看到可以使用这个参数:single_parent=True,但这也不管用。

user1 = User(user_id='user1234',password='alsdjwe1')
user2 = User(user_id='user2345',password='asfr5421')
student1 = Student(user = user1)
professor1 = Professor(user = user2)
db.session.delete(user1)
db.session.delete(user2)

如果有人能帮我解决这个问题,我会非常感激。

非常感谢,

Thiago。

1 个回答

1

在你的关系中使用 cascade 参数。

class Student(db.Model):
    __tablename__ = 'student'
    user_id = Column(db.String(8), ForeignKey('user.user_id'), primary_key = True)
    user = db.relationship('User', cascade='delete')

class Professor(db.Model):
    __tablename__ = 'professor'
    user_id = Column(db.String(8), ForeignKey('user.user_id'), primary_key = True)
    user = db.relationship('User', cascade='delete')

如果你的需求需要,可以了解一下 delete-orphan 的相关内容。

撰写回答