Skip to main content
 首页 » 编程设计

python之DeleteView 标记为不活动而不是删除

2025年05月04日20mate10pro

是否有一些优雅的解决方案来使用 Django 的 DeleteView 而不是实际删除对象,将它们标记为非事件状态?我喜欢 DeleteView 的简单性,但希望将数据保留在后端,而不是将其删除。

请您参考如下方法:

优雅的解决方案是覆盖 Model 和 Manager 以在 delete 上更新字段。这是一个作为抽象模型的实现,因此它可以被任何其他模型扩展。如果您的模型中已经有删除字段,您可以根据需要修改它。

软删除抽象模型

class SoftDeletionModel(models.Model): 
    deleted_at = models.DateTimeField(blank=True, null=True) 
 
    objects = SoftDeletionManager() 
    all_objects = SoftDeletionManager(alive_only=False) 
 
    class Meta: 
        abstract = True 
 
    def delete(self): 
        self.deleted_at = timezone.now() 
        self.save() 
 
    def hard_delete(self): 
        super(SoftDeletionModel, self).delete() 

对象管理器

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) 

有关说明,请参阅 Soft Deletion in Django