我目前在维护一个旧系统,同时新系统正在部署。我最近注意到,在尝试删除特定模型中的某些对象时,会出现超时问题。我发现与以下问题有关,该问题已有接受的答案:Django管理页面在尝试编辑/创建时挂起(直至超时错误)。
我的问题是,相关的对象与我所问的模型没有直接关系。
例如,我有以下模型(由于我的公司IP原因,名称是通用的):
是否有一种方法可以避免这种情况,例如通过覆盖自定义模板(如 delete_confirmation_template)或通过其他任何方法?理想情况下,我仍然希望显示摘要,但考虑到这个问题的性质,我不确定是否可能。
一些上下文细节:
我的问题是,相关的对象与我所问的模型没有直接关系。
例如,我有以下模型(由于我的公司IP原因,名称是通用的):
ModelA
是我在 Django 管理页面中删除时遇到问题的模型ModelB
包含对ModelA
的 ForeignKey 字段ModelC
包含对ModelB
的 ForeignKey 字段ModelD
包含对ModelC
的 ForeignKey 字段ModelE
包含对ModelD
的 ForeignKey 字段
ModelE
可以包含任何 entry 中 tens/hundreds/thousands 条数据的条目- 对于任何 entry,
ModelC
都可以包含 tens/hundreds/thousands 条数据的条目
ModelA
时,Django 会尝试生成所有关联对象直到 ModelE
,对于具有大量相关的 ModelC
和 ModelE
来说,这将导致超时。是否有一种方法可以避免这种情况,例如通过覆盖自定义模板(如 delete_confirmation_template)或通过其他任何方法?理想情况下,我仍然希望显示摘要,但考虑到这个问题的性质,我不确定是否可能。
一些上下文细节:
- 我认为这可能是由于我们数据库模式整体结构较差,但正如我之前提到的,这是一个旧系统。
- 我不需要立即修复此问题,因为除了当前情况/任务(清除重复条目,用户错误未通过正确的表单进行控制;现在表单已检查此问题)外,我永远不会删除此模型的 entry。我只是在清理事项并在测试所述迁移脚本时利用该中间页面作为健全性检查时注意到这一点。
ForeignKey
字段的on_delete
值是什么?您是否意味着on_delete
设置为CASCADE
,因此管理员正在尝试显示所有相关的模型,这些模型也将被删除? - dirkgrotenCASCADE
是正确的行为(通常在Django版本<2.x中,开发人员只是没有考虑适当的设置,所以默认为CASCADE
)。也许你想要它成为SET_NULL
,这将解决你的问题。其次,如果CASCADE
是正确的行为,那么除了更改超时设置之外,你无能为力:所有相关模型需要被获取的事实不仅仅是由于确认模板的显示,当实际的delete()
操作发生时,它也会发生。 - dirkgrotenSET_NULL
更为合适。具体来说,对于ModelC
及其后续模型,它们应该永远不会被删除,因为它们是自动化系统的测试结果,应该始终保留。此外,ModelA
也可能永远不会被删除。对于我的当前情况,我将简单地禁用管理站点中的删除功能(https://dev59.com/7W855IYBdhLWcg3w_5im)。 - golkedjModelAdmin
类上设置has_delete_permission()
以返回False
(或检查用户的角色,例如仅对于is_superuser
返回True
),请参见此处。 - dirkgroten