定义
- SOFT DELETE - 不从数据库中删除对象,但似乎这样做
- HARD DELETE - 从数据库中完全删除对象
问题
在代码库(特别是 Django 项目)中实现软删除的最佳方法是什么?
我认为最简单的方法是简单地添加:
is_deleted = models.BooleanField(default=False)
到实现 a 的超类softDeleteObject
,然后覆盖delete()
以在相关对象上设置适当的标志。相关对象也需要从同一个超类继承。
另一种方法是删除原始文件,并拥有相当于存档对象的内容,该对象是已删除对象的表示。
分析
第一个似乎具有更大程度的简单性,但确实需要一些广泛的覆盖 - 例如,User
必须覆盖以确保所有已删除对象的外键关系仍然保持,并且删除用户然后没有' t 硬删除所有软删除的对象。
第二个可以使用触发创建代理对象的 pre_delete 信号来实现。这同样有一些优点(不需要覆盖所有delete()
方法),但确实需要实现项目中使用的模型的存档版本。
哪个更可取,还有其他选择吗?