【问题标题】:Mark as deleted instead of actually deleting in DeleteView在 DeleteView 中标记为已删除而不是实际删除
【发布时间】:2015-02-15 18:57:28
【问题描述】:

我正在使用 Django 中的 DeleteView 删除不同模型中的对象。

问题是我不希望对象被完全删除,而只是隐藏。首先,我认为保持我的视图不变是有意义的,而是覆盖每个模型中的删除方法来执行以下操作

def delete(self, force=False):
    if force:
        return super(ModelName, self).delete()
    else:
        self.is_deleted = True
        self.save()

但后来我注意到删除方法不会被批量删除,所以这个方法风险太大。

有人可以推荐一个好方法吗?我仍然想保持 DeleteView 的正常行为,但它应该只是“停用”对象而不是删除它们。

删除视图如下:

def delete(self, request, *args, **kwargs):
    """
    Calls the delete() method on the fetched object and then
    redirects to the success URL.
    """
    self.object = self.get_object()
    success_url = self.get_success_url()
    self.object.delete()
    return HttpResponseRedirect(success_url)

如果我将self.object.delete() 替换为就足够了

self.object.is_deleted = True
self.object.save()

当我将我的对象标记为已删除时,如何确保我的查询集不会包含已删除的对象?我可以简单地替换 ListView 中的 get_queryset() ,但它们应该被排除在页面上的任何查询集中之外,所以我想知道如果我改为自定义对象管理器是否会得到更好的结果?

我一直在研究 django-reversion。如果我想恢复它们,我可以简单地以正常方式删除所有对象然后使用 django-reversion 吗?这种解决方案有什么缺点吗?

【问题讨论】:

标签: python django django-reversion


【解决方案1】:

当我将我的对象标记为已删除时,如何确保我的查询集不会包含已删除的对象?

正如评论所述,the Django-only solution is writing a customer Manager 了解您的 is_deleted 字段。

我一直在研究 django-reversion。如果我想恢复它们,我可以简单地以正常方式删除所有对象,然后使用 django-reversion 吗?

是的,只要您将删除的内容包含在版本中即可。这可以像 using the reversion middleware 一样简单地包装所有删除和保存:

MIDDLEWARE_CLASSES = (
    'reversion.middleware.RevisionMiddleware',
    # Other middleware goes here...
)

这个解决方案有什么缺点吗?

我没有找到,它得到了很好的支持,除了删除支持之外,它还具有版本跟踪。

【讨论】:

    【解决方案2】:

    但后来我注意到删除方法不会被批量调用 删除,所以这种方法风险太大。

    您可以为此编写自己的 QuerySet 并将其用作_manager。相同的 QuerySet 可以负责隐藏已删除的字段以使其不显示。请记住留出一些方法来检索所有已删除的字段。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多