如何删除引用对象的所有嵌套对象?

时间:2018-10-24 03:06:30

标签: python django postgresql

我有一个在多个模型中都设置为外键的模型。现在,如果从任何模型中引用了对象,则从模型中删除任何对象都会引发ProtectedError。我想让用户在一次操作中删除带有所有受保护对象的对象。

我可以通过简单地调用

来删除第一层受保护对象
....    
except ProtectedError as e
    e.protected_objects.delete()
....

但是,当protected_objects拥有自己的受保护对象时,该操作将失败并引发另一个第二层ProtectedError。我要实现的是,删除所有受保护的对象,不加区别地将其存在于哪一层。我知道执行该操作可能很危险。但是我可以在没有复杂解决方案的情况下实现这一目标。预先感谢。

源代码,我试图在其中执行ajax操作:

try:
    obj_list = model.objects.filter(pk__in=pk_list)
    log_deletion(request, obj_list, message='Record Deleted')
    obj_list.delete()
    return JsonResponse({'success': True, 'status_message': '{0} record(s) has been deleted successfully.'.format(len(pk_list))})
except ProtectedError as e:
    e.protected_objects.delete()
    return JsonResponse({'success': False, 'status_message': 'This operation cannot be executed. One or more objects are in use.'})

2 个答案:

答案 0 :(得分:1)

通常,您可以使用循环:

table-layout: fixed;

要记录错误发生在哪一层,您可以添加一个计数器:

map_signif_level = c("***"=0.001, "**"=0.01, "*"=0.05)

答案 1 :(得分:1)

似乎您可能不想在外键的定义上使用on_delete=models.PROTECT。您是否考虑过changing the on delete改用CASCADE?如果使用级联,则无需迭代依赖项即可先删除它们。

而不是:

class OtherModel(models.Model):
    link = models.ForeignKey("Link", on_delete=models.PROTECT)

您可以定义以下模型:

class OtherModel(models.Model):
    link = models.ForeignKey("Link", on_delete=models.CASCADE)

从管理员删除使用CASCADE的模型时,将显示一个中间页面,其中列出了所有相关对象也将被删除。