假设我在默认数据库中有d-anang模型,例如A - > B - > C - > D.
C是D中的外键,类似于C中的B和A中的C.
在删除对象A时,Django的默认行为是直接或间接地与A相关的所有对象将被自动删除(在删除级联上)。因此,B,C,D将被自动删除。 / p>
我希望以这样的方式实现删除:在删除A的对象时,它将被移动到另一个名为'del'的数据库。同时,B,C,D的所有其他相关对象也将被移动
有一种简单的方法可以一次性实现吗?
答案 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)