软删除django数据库对象

Vai*_*hah 5 python django web django-rest-framework

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

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

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

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

是否有一种简单的方法可以一次性实现这一目标?

Vai*_*hah 6

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

deleted = models.BooleanField(default=False)
Run Code Online (Sandbox Code Playgroud)

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

def soft_del(self):
        self.deleted = True            
        self.save()
Run Code Online (Sandbox Code Playgroud)

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

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

class B(models.Model)
    a =  models.ForeignKey(A,related_name='related_Bs'))
Run Code Online (Sandbox Code Playgroud)

然后在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()
Run Code Online (Sandbox Code Playgroud)


Eug*_*tov 2

只需重写delete模型的方法A并在删除之前检查关系即可。如果它不为空 - 将对象移动到另一个表/数据库。