6

定义

  • SOFT DELETE - 不从数据库中删除对象,但似乎这样做
  • HARD DELETE - 从数据库中完全删除对象

问题

在代码库(特别是 Django 项目)中实现软删除的最佳方法是什么?

我认为最简单的方法是简单地添加:

is_deleted = models.BooleanField(default=False)

到实现 a 的超类softDeleteObject,然后覆盖delete()以在相关对象上设置适当的标志。相关对象也需要从同一个超类继承。

另一种方法是删除原始文件,并拥有相当于存档对象的内容,该对象是已删除对象的表示。

分析

第一个似乎具有更大程度的简单性,但确实需要一些广泛的覆盖 - 例如,User必须覆盖以确保所有已删除对象的外键关系仍然保持,并且删除用户然后没有' t 硬删除所有软删除的对象。

第二个可以使用触发创建代理对象的 pre_delete 信号来实现。这同样有一些优点(不需要覆盖所有delete()方法),但确实需要实现项目中使用的模型的存档版本。

哪个更可取,还有其他选择吗?

4

1 回答 1

1

为什么不在需要的特定模型上使用活动/已删除/状态标志并这样做呢?或者检查应用程序django-reversion,可能有你需要的一切;)

于 2013-02-19T12:48:54.670 回答