【问题标题】:Django & Soft Deletion: Implementation architectureDjango & 软删除:实现架构
【发布时间】: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


    【解决方案1】:

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

    【讨论】:

    • 嗯,这是问题中的选项 1,但是,例如,这需要覆盖 User,因为 delete() 方法不应删除用户,否则它将损坏所有下游 FKey 关系。这当然是一种可能性,但我想知道是否有其他/更好的想法......
    • @jvc26 这取决于您的使用情况。 django-reversion 已经实现了第二个选项,你可以看看它。我使用选项 2 的实现来归档已删除的对象(例如垃圾邮件用户)并感到高兴:无需重写管理器或照顾 Django Admin 是否显示已删除的对象,只需在另一个模型的更改列表中显示它们带有描述删除原因的注释及其__unicode__()s。
    • 我认为如何做到这一点没有一般规则,但这取决于给定的情况。删除/禁用用户可能非常复杂。如果您删除一个用户,您必须决定如何处理相关对象(删除或映射到一些准备好的用户,如“已删除用户”)。对于像 Projects 这样的其他模型,您可以使用“已完成”标志并且默认情况下不在列表中显示它。通常你不想删除任何数据。
    • 感谢@Bruce 关于删除用户和将对象重新分配给其所有权的意见,您将如何处理?问题当然是禁用用户,其他标志/存档版本相当简单......
    • 我认为这是一个更复杂的话题,我可以用几句话来描述。禁用用户帐户,然后决定如何处理每个相关数据。例如,当您有用户开始的讨论时,如果您删除它,您可能会丢失很多重要内容。例如,如果您这样做 {% if user.active %}{{ user.get_full_name }}{% else %}Anonymous{% endif %} 或将用户设置为某个匿名帐户,您仍然可以对用户的真实帐户进行一些引用讨论帖子中的名字(比如“我不同意比利乔写的……”)。在这种情况下,写一个好的服务条款:)
    猜你喜欢
    • 2016-07-08
    • 2016-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多