gpt4 book ai didi

python - 如何删除引用一个对象的所有嵌套对象?

转载 作者:行者123 更新时间:2023-11-29 12:51:28 27 4
gpt4 key购买 nike

我有一个模型在多个模型中被设置为外键。现在从模型中删除任何对象都会抛出 ProtectedError,如果它在任何这些模型中被引用。我想让用户在一次操作中删除包含所有 protected 对象的对象。

我可以通过简单地调用来删除第一层 protected 对象

....    
except ProtectedError as e
e.protected_objects.delete()
....

但是当protected_objects 有自己的protected 对象时,操作失败并抛出另一个第二层ProtectedError。我想要实现的是,删除所有 protected 对象,不区分它存在于哪一层。我知道执行它可能是一项危险的操作。但是我可以在没有复杂解决方案的情况下实现这一目标吗?提前致谢。

源代码,我在其中尝试执行 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.'})

最佳答案

您似乎不想在外键的定义上使用 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 的模型时,将显示一个中间页面,其中列出了所有也将被删除的依赖对象。

关于python - 如何删除引用一个对象的所有嵌套对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52960521/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com