2 回答

TA贡献1752条经验 获得超4个赞
通常,您可以使用循环:
...
except ProtectedError as e:
obj = e.protected_objects
while True:
try:
obj.delete()
except ProtectedError as e:
obj = e.protected_objects
else:
break
...
要记录错误发生在哪个层,您可以添加一个计数器:
from itertools import count
obj_list = model.objects.filter(pk__in=pk_list)
for layer in count():
try:
log_deletion(request, obj_list, message='Record Deleted in layer {}'.format(layer))
obj_list.delete()
except ProtectedError as e:
obj_list = e.protected_objects
else:
if layer == 0:
return JsonResponse({'success': True, 'status_message': '{0} record(s) has been deleted successfully.'.format(len(pk_list))})
else:
return JsonResponse({'success': False, 'status_message': 'This operation cannot be executed. One or more objects are in use.'})

TA贡献1810条经验 获得超4个赞
看起来您可能不想使用on_delete=models.PROTECT
外键的定义。您是否考虑过将 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
中间页面的模型时,将显示列出也将被删除的所有依赖对象。
添加回答
举报