gpt4 book ai didi

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

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

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

最佳答案

优雅的解决方案是覆盖 ModelManager 以在 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

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

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