Python 删除视图标记为不活动,而不是删除?

Python 删除视图标记为不活动,而不是删除?,python,django,Python,Django,使用Django的DeleteView,但实际上却删除了对象,并将其标记为非活动,是否有一些优雅的解决方案?我喜欢DeleteView的简单性,但希望将数据保留在后端,而不是将其删除。DeleteView继承DeletionMixin,因此您可以预定义delete方法。 DeleteView继承DeletionMixin,因此您可以预定义delete方法。 覆盖DeleteView中的delete方法,如下所示 class Example(DeleteView): def delete(

使用Django的DeleteView,但实际上却删除了对象,并将其标记为非活动,是否有一些优雅的解决方案?我喜欢DeleteView的简单性,但希望将数据保留在后端,而不是将其删除。

DeleteView继承DeletionMixin,因此您可以预定义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)