定义
题
在代码库(特别是 Django 项目)中实现软删除的最佳方法是什么?
我认为最简单的方法是简单地添加:
is_deleted = models.BooleanField(default=False)
到实现 softDeleteObject
的父类(super class),然后覆盖 delete()
在有问题的对象上设置适当的标志。相关对象也需要从同一个父类(super class)继承。另一种方法是删除原始对象,并拥有相当于已删除对象表示的存档对象。
分析
第一个看起来更简单,但确实需要一些广泛的覆盖 - 例如,
User
必须被覆盖以确保所有已删除对象的外键关系仍然存在,并且删除用户不会硬删除其所有软删除对象。第二个可以用 pre_delete 信号实现,触发代理对象的创建。这再次具有一些优点(不需要覆盖所有
delete()
方法),但确实需要实现项目中使用的模型的存档版本。哪个更可取,还有其他选择吗?
最佳答案
为什么不在需要的特定模型上使用事件/已删除/状态标志并这样做呢?或查看应用 django-reversion , 可能有你需要的一切;)
关于Django 和软删除 : Implementation architecture,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14957416/