【发布时间】:2019-04-22 23:54:51
【问题描述】:
我目前正在维护一个旧系统,同时启动一个新系统。我最近注意到,尝试从特定模型中删除某些对象时出现超时。我已将此归结为与以下问题有关,该问题的答案已被接受:Django admin hangs (until timeout error) for a specific model when trying to edit/create
我遇到的问题是相关的对象与我的模型没有直接关系。
例如,我有以下模型(由于我公司的知识产权,一般命名为保持模糊):
-
ModelA这是我在从 Django 管理站点删除时看到的问题的模型 -
ModelB包含指向ModelA的 ForeignKey 字段 -
ModelC包含指向ModelB的 ForeignKey 字段 -
ModelD包含指向ModelC的 ForeignKey 字段 -
ModelE包含指向ModelD的 ForeignKey 字段
型号详情:
-
ModelE可以包含数十/数百/数千个条目,用于 的任何条目
-
ModelC。此外,ModelC可以包含ModelB的任何条目的数十/数百/数千个条目
目前,当我尝试删除ModelA 时,Django 会尝试生成所有关联对象,一直到ModelE,这在某些情况下会导致超时,因为关联ModelC 和ModelE 的数量很大。
有没有办法通过覆盖自定义模板(例如 delete_confirmation_template)或通过任何其他方法来避免这种情况?理想情况下,我仍想显示摘要,但我不确定根据这个问题的性质这是否可行。
上下文的一些细节:
- 我觉得这可能是由于我们的 DB Schema 的整体结构不佳,但就像我之前提到的,这是一个旧系统。
- 我不需要立即解决此问题,因为我实际上永远不会删除此模型的条目,除非我当前的场景/清理重复条目的任务(用户错误未由表单正确控制;表单现在检查此问题)这是通过迁移脚本完成的。我只是在尝试清理内容并在测试所述迁移脚本时利用此中间页面作为健全性检查时注意到了这一点
【问题讨论】:
-
哪个版本的 Django?各种
ForeignKey字段的on_delete值是多少?您是否暗示on_delete设置为CASCADE,因此管理员试图显示所有相关模型也将被删除? -
Django 1.11 版,是的,几乎在所有情况下它都设置为 CASCADE
-
首先,我会问自己
CASCADE是否是正确的行为(通常在Django版本CASCADE )。也许您希望它是SET_NULL,这将解决您的问题。其次,如果CASCADE是正确的行为,那么除了更改超时设置之外您无能为力:需要获取所有相关模型的事实不仅仅是由于确认模板的显示,它会当实际的delete()操作发生时,无论如何都会发生。 -
@dirkgroten 我自己一直在考虑这个问题。鉴于数据和模型的性质,我认为在许多情况下将 on_delete 设置为
SET_NULL会更合适。具体来说,对于ModelC及更高版本,这些不应被删除,因为它们是自动化系统的测试结果,应始终保留。此外,ModelA也不应该被删除。我认为对于我目前的情况,我将简单地禁用管理站点的删除功能 (stackoverflow.com/questions/4043843/…) -
你可以在你的
ModelAdmin类上设置has_delete_permission()返回False(或者检查用户的角色,例如返回True只为is_superuser),见here跨度>
标签: django python-3.x django-models django-templates django-views