Django&软删除:实现架构

时间:2013-02-19 12:23:30

标签: django architecture django-models django-database

解释

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

问题

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

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

is_deleted = models.BooleanField(default=False)

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

替代方法是删除原始文件,并将其作为存档对象的数量,该对象是已删除对象的表示。

分析

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

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

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

1 个答案:

答案 0 :(得分:1)

为什么不在需要它的特定型号上使用活动/删除/状态标志并以这种方式执行?或者查看应用django-reversion,可能还有你需要的一切;)