gpt4 book ai didi

python - 在 DeleteView 中标记为已删除而不是实际删除

转载 作者:太空宇宙 更新时间:2023-11-04 03:37:08 24 4
gpt4 key购买 nike

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

问题是我不希望对象被完全删除,而只是隐藏起来。首先,我认为保留我的 View 是有意义的,而不是重写每个模型中的 delete 方法以执行以下操作

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

但是后来发现批量删除不会调用delete方法,所以这个方法风险太大。

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

删除 View 如下:

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

最佳答案

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

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

I've been looking at django-reversion. Could I simply just delete all objects in the normal manner and then use django-reversion if I want to restore them?

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

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

Are there any disadvantages of this solution?

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

关于python - 在 DeleteView 中标记为已删除而不是实际删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28529871/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com