2

我正在使用 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 吗?这种解决方案有什么缺点吗?

4

2 回答 2

1

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

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

于 2015-02-16T09:27:21.107 回答
1

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

正如评论所述,仅 Django 的解决方案是编写一个了解您的is_deleted领域的客户经理。

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

是的,只要您将删除的内容包含在版本中。这可以像使用 reversion 中间件来包装所有删除和保存一样简单:

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

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

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

于 2015-02-16T00:03:31.210 回答