Django&Soft Deletion:实现架构

jvc*_*c26 5 architecture django django-models django-database

定义

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

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

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

is_deleted = models.BooleanField(default=False)
Run Code Online (Sandbox Code Playgroud)

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

另一种方法是删除原始文件,并将其等于存档对象,该对象是已删除对象的表示.

分析

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

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

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

Bru*_*uce 1

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