【问题标题】:Maintaining history by soft deleting the row of table通过软删除表的行来维护历史
【发布时间】: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),那么我有以下选项,

  1. 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
}

【问题讨论】:

  • 您可以为Table2Table3 设计一个模型管理器来自动过滤掉Table1 记录未激活的关系?这意味着每当您使用objects.all()objects.filter() 时,它将应用默认过滤器(table1__active=True)。见这里stackoverflow.com/a/11617918/11475846
  • 是的,这将部分解决问题。现在,我希望当 table1__active 设置为 false 时,即删除一行条目,那么 table2__active 和 table3__active 也应该设置为 false。
  • 啊,如果您不想在 Table2Table3 上都有 active 字段,我的回答更适合您。如果你给了我会写一个答案。

标签: python mysql django


【解决方案1】:

is_active 字段在Table1 上发生更改后,您需要编写一个信号来更改外键关系的状态。

models.py

from django.db.models.signals import post_save

def set_active(sender, instance, **kwargs):
    instance.table2_set.all().update(is_active=instance.is_active)
    instance.table3_set.all().update(is_active=instance.is_active)

post_save.connect(set_active, sender=table1)

使用post_save 信号,只要is_active 状态发生变化,它就会更新所有关系。 Table2Table3 现在应该在更改时反映 Table1 的值。

【讨论】:

  • 你是如何处理这种情况的,只有当发送者的 is_active 标志设置为 false 时才会调用这个信号?
  • @Ayush 每当Table1模型发生变化时,代码都会改变其他模型的活动状态。这将反映它是 False 还是 True。
猜你喜欢
  • 1970-01-01
  • 2016-01-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-19
  • 2015-08-06
  • 2010-10-18
相关资源
最近更新 更多