通过 Django admin 删除对象时是不是可以禁用相关对象的生成?
Posted
技术标签:
【中文标题】通过 Django admin 删除对象时是不是可以禁用相关对象的生成?【英文标题】:Is it possible to disable the generation of related objects when deleting an object via Django admin?通过 Django admin 删除对象时是否可以禁用相关对象的生成? 【发布时间】: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 的整体结构不佳,但就像我之前提到的,这是一个旧系统。 我不需要立即解决此问题,因为我实际上永远不会删除此模型的条目,除非我当前的场景/清理重复条目的任务(用户错误未由表单正确控制;表单现在检查此问题)这是通过迁移脚本完成的。我只是在尝试清理内容并在测试所述迁移脚本时利用此中间页面作为健全性检查时注意到了这一点Timeout screenshot
【问题讨论】:
哪个版本的 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
也不应该被删除。我认为对于我目前的情况,我将简单地禁用管理站点的删除功能 (***.com/questions/4043843/…)
你可以在你的ModelAdmin
类上设置has_delete_permission()
返回False
(或者检查用户的角色,例如返回True
只为is_superuser
),见here跨度>
【参考方案1】:
从 cmets 的讨论中,我得出以下结论:
模型的on_delete
设置为 CASCADE
不正确,导致在尝试删除模型时检索相关对象的时间非常长
由于我不想在其他特定模型与它们有关联时删除这些对象,所以我分析并适当地将 on_delete
设置为 PROTECT
(如果适用)
现在,当我尝试删除一个对象时,由于受保护的相关项目,它不允许我删除该对象。它还解决了我之前观察到的超时问题
如果对象没有相关的受保护对象,我仍然可以通过 Django 管理站点从该模型中删除对象,这最终是我想要的功能
【讨论】:
以上是关于通过 Django admin 删除对象时是不是可以禁用相关对象的生成?的主要内容,如果未能解决你的问题,请参考以下文章
django admin 在 save_model 方法中删除内联对象
Django Admin Cookbook-14如何在Django Admin后台移除“删除所选”操作
Django Admin Cookbook-20如何删除模型的“添加”/“删除”按钮