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