【发布时间】:2021-10-19 15:02:41
【问题描述】:
最初,我很难删除 SQL 行。现在,我想通过在表“is_active”中添加一个新列来软删除该行。如果 is_active=False,这意味着该行被删除,它现在是历史的一部分。
但问题在于通过外键引用该表的其他表。早些时候,当删除这一行时,会自动从其他表(model.cascade)中删除记录。示例;
Table 1{
id uuid,
is_active bool,
.
.
}
Table2{
id uuid,
fk foreignKey(Table1, on_delete=models.cascade)
}
Table3{
id uuid,
fk foreignKey(Table1, on_delete=models.cascade)
}
现在,如果我要软删除 table1(使 is_active=False),那么我有以下选项,
- 将 is_active 列添加到所有其他引用 table1 的表中。并按照与表 1 相同的过程处理这些表。
ISSUE:这将是一项非常繁忙的任务,因为其他一些表可能指向 table2,结果可能会被其他一些表引用。并且我们手动为 table2 和 table3 设置了 is_active=False。
QS。有没有更好的方法来软删除表?像这样的,
Table2{
id uuid,
fk foreignKey(Table1, on_is_active_is_False=set.is_active=False),
is_active bool
}
【问题讨论】:
-
您可以为
Table2和Table3设计一个模型管理器来自动过滤掉Table1记录未激活的关系?这意味着每当您使用objects.all()或objects.filter()时,它将应用默认过滤器(table1__active=True)。见这里stackoverflow.com/a/11617918/11475846 -
是的,这将部分解决问题。现在,我希望当 table1__active 设置为 false 时,即删除一行条目,那么 table2__active 和 table3__active 也应该设置为 false。
-
啊,如果您不想在
Table2和Table3上都有active字段,我的回答更适合您。如果你给了我会写一个答案。