软删除django数据库对象

时间:2016-06-20 11:59:32

标签: python django web django-rest-framework

假设我在默认数据库中有d-anang模型,例如A - > B - > C - > D.

C是D中的外键,类似于C中的B和A中的C.

在删除对象A时,Django的默认行为是直接或间接地与A相关的所有对象将被自动删除(在删除级联上)。因此,B,C,D将被自动删除。 / p>

我希望以这样的方式实现删除:在删除A的对象时,它将被移动到另一个名为'del'的数据库。同时,B,C,D的所有其他相关对象也将被移动

有一种简单的方法可以一次性实现吗?

4 个答案:

答案 0 :(得分:6)

我已经在我的数据库的每个模型上使用已删除的标志实现了这个功能,而不是将内容移动到单独的数据库,如下所示:

deleted = models.BooleanField(default=False)

并为每个模型定义了soft_del函数,如下所示:

def soft_del(self):
        self.deleted = True            
        self.save()

因此删除的模型将存在于同一数据库中,并将deleted标志设置为True。

为了产生ON DELETE CASCADE效果,我已经为每个模型添加了这样的soft_del函数,并为模型中的每个外键提供了一个related_name,如下所示:

class B(models.Model)
    a =  models.ForeignKey(A,related_name='related_Bs'))

然后在parent的soft_del内调用child的soft_del,如下所示:

def soft_del_A(self):
    self.deleted = True 
    for b in A.related_Bs.all():
        b.soft_del_B()

    self.save()

答案 1 :(得分:1)

只需覆盖模型delete的{​​{1}}方法,然后在删除前检查关系。如果它不为空 - 将对象移动到另一个表/ DB。

答案 2 :(得分:0)

有一个库可以匹配django在软删除时的默认删除行为。 (即使用Cascade,什么都不做,等等来自模型规范)。

https://github.com/upgrad/django-deletes

PS:该库仍处于测试阶段,但正在积极开发。

答案 3 :(得分:0)

也许你可以试试https://github.com/drneox/django-paranoid

允许执行软删除并恢复它。

使用:

from django_paranoid.admin import ParanoidAdmin

class MyModelAdmin(ParanoidAdmin):
    pass

软删除:

m = MyModel.objects.last()
m.delete()

m = MyModel.objects.last()
>>> m
>>>

获取已删除的对象:

m = MyModel.objects_with_deleted.last()
>>> m
<MyModel: name>
>>> m.deleted_at
datetime.datetime(2019, 8, 10, 6, 16, 44, 633727, tzinfo=<UTC>)

恢复对象:

 m.restore()

硬删除:

m = MyModel.objects.last()
m.delete(True)