Python 删除视图标记为不活动,而不是删除?
使用Django的DeleteView,但实际上却删除了对象,并将其标记为非活动,是否有一些优雅的解决方案?我喜欢DeleteView的简单性,但希望将数据保留在后端,而不是将其删除。DeleteView继承DeletionMixin,因此您可以预定义delete方法。Python 删除视图标记为不活动,而不是删除?,python,django,Python,Django,使用Django的DeleteView,但实际上却删除了对象,并将其标记为非活动,是否有一些优雅的解决方案?我喜欢DeleteView的简单性,但希望将数据保留在后端,而不是将其删除。DeleteView继承DeletionMixin,因此您可以预定义delete方法。 DeleteView继承DeletionMixin,因此您可以预定义delete方法。 覆盖DeleteView中的delete方法,如下所示 class Example(DeleteView): def delete(
DeleteView继承DeletionMixin,因此您可以预定义delete方法。
覆盖DeleteView中的delete方法,如下所示
class Example(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()
self.object.is_deleted = True # Declare a boolean field is_deleted in your model. Default value is Flase.
return HttpResponseRedirect(self.get_success_url())
重写DeleteView中的delete方法,如下所示
class Example(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()
self.object.is_deleted = True # Declare a boolean field is_deleted in your model. Default value is Flase.
return HttpResponseRedirect(self.get_success_url())
优雅的解决方案是覆盖
模型
和管理器
,以更新删除
上的字段。这是一个抽象模型的实现,因此它可以被任何其他模型扩展。如果模型中已有删除字段,则可以根据需要对其进行修改
软删除抽象模型
对象管理器
QuerySet
有关说明,请参见优雅的解决方案将覆盖
模型
和管理器
,以更新删除
上的字段。这是一个抽象模型的实现,以便可以由任何其他模型扩展。如果模型中已有删除字段,则可以根据需要对其进行修改
软删除抽象模型
对象管理器
QuerySet
有关说明,请参阅
class SoftDeletionManager(models.Manager):
def __init__(self, *args, **kwargs):
self.alive_only = kwargs.pop('alive_only', True)
super(SoftDeletionManager, self).__init__(*args, **kwargs)
def get_queryset(self):
if self.alive_only:
return SoftDeletionQuerySet(self.model).filter(deleted_at=None)
return SoftDeletionQuerySet(self.model)
def hard_delete(self):
return self.get_queryset().hard_delete()
class SoftDeletionQuerySet(QuerySet):
def delete(self):
return super(SoftDeletionQuerySet, self).update(deleted_at=timezone.now())
def hard_delete(self):
return super(SoftDeletionQuerySet, self).delete()
def alive(self):
return self.filter(deleted_at=None)
def dead(self):
return self.exclude(deleted_at=None)