我有一个在多个模型中都设置为外键的模型。现在,如果从任何模型中引用了对象,则从模型中删除任何对象都会引发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.'})
答案 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
的模型时,将显示一个中间页面,其中列出了所有相关对象也将被删除。