通过Django管理员删除对象时,是否可以禁用相关对象的生成?

时间:2018-11-20 14:00:39

标签: django python-3.x django-models django-templates django-views

在启动新系统时,我目前正在维护旧系统。最近我注意到,尝试从特定模型中删除某些对象时出现超时。我已将此归结为与以下问题相关,该问题的答案已被接受:Django admin hangs (until timeout error) for a specific model when trying to edit/create

我遇到的问题是相关的对象与所讨论的模型不是直接相关的。

例如,我有以下模型(由于我公司的IP,其名称通常模糊不清):

  • ModelA是我从Django Admin网站删除时看到的模型
  • ModelB,其中包含ModelA的ForeignKey字段
  • ModelC,其中包含ModelB的ForeignKey字段
  • ModelD,其中包含ModelC的ForeignKey字段
  • ModelE,其中包含ModelD的ForeignKey字段

型号详情:

  • ModelE可以包含成千上万个条目,对于
  • 的任何条目
  • ModelC。另外,ModelC的任何条目都可以包含成千上万个条目

当前,当我尝试删除ModelB时,Django尝试一直生成所有关联对象,直到ModelA,这在某些情况下会导致超时,并且关联ModelE的数量很高和ModelC

是否有办法通过覆盖自定义模板(例如delete_confirmation_template)或通过任何其他方法来避免这种情况?理想情况下,我仍然希望显示摘要,但不确定此问题的性质是否可能。

有关上下文的一些细节:

  • 我觉得这可能是由于我们数据库模式的整体结构不佳所致,但是就像我前面提到的那样,这是一个旧系统。
  • 我不需要立即修复此问题,因为我实际上永远不会删除该模型的条目,除非我当前的情况/任务是清理重复的条目(用户错误不受表单正确控制;表单现在对此进行检查)这是通过迁移脚本完成的。我只是在清理内容并在测试上述迁移脚本时利用此中间页作为健全性检查时注意到了这一点

Timeout screenshot

1 个答案:

答案 0 :(得分:0)

从评论中的讨论中,我得出以下结论:

  • on_delete的模型设置为CASCADE是不正确的,并且在尝试删除模型时导致检索相关对象的时间非常长
  • 由于我不想在其他特定模型与它们相关联时删除这些对象,因此我分析并在适用的情况下将on_delete设置为PROTECT
  • 现在,当我尝试删除一个对象时,由于受保护的相关项目,它将不允许我删除该对象。它还可以解决我之前观察到的超时问题

如果没有相关的受保护对象,这仍然允许我通过Django管理站点从该模型中删除对象,这最终是我想要的功能