【问题标题】:Why is Django's admin detail page making so many queries?为什么 Django 的管理详细信息页面会进行如此多的查询?
【发布时间】:2012-10-22 22:39:01
【问题描述】:

我正在开发一个相当标准的 Django 应用程序,最近我一直在调整管理员。虽然列表视图以合理的速度加载,但细节和添加视图需要大约 10 秒才能加载。

我不确定为什么会这样——我怀疑这与数据库被过度查询有关,事实上确实如此。打开日志记录后,我发现控制器正在查询表中的每个 id:

...
[Mon Oct 22 18:32:52 2012] [error] (0.001) SELECT `courses_course`.`id`, `courses_course`.`semester`,
 `courses_course`.`name`, `courses_course`.`credits`, `courses_course`.`description`, `courses_course
`.`history_id`, `courses_course`.`oldpcr_id`, `courses_course`.`primary_alias_id` FROM `courses_cours
e` WHERE `courses_course`.`id` = 2077 ; args=(2077,)
[Mon Oct 22 18:32:52 2012] [error] (0.000) SELECT `courses_course`.`id`, `courses_course`.`semester`,
 `courses_course`.`name`, `courses_course`.`credits`, `courses_course`.`description`, `courses_course
`.`history_id`, `courses_course`.`oldpcr_id`, `courses_course`.`primary_alias_id` FROM `courses_cours
e` WHERE `courses_course`.`id` = 2078 ; args=(2078,)
[Mon Oct 22 18:32:52 2012] [error] (0.001) SELECT `courses_course`.`id`, `courses_course`.`semester`,
 `courses_course`.`name`, `courses_course`.`credits`, `courses_course`.`description`, `courses_course
`.`history_id`, `courses_course`.`oldpcr_id`, `courses_course`.`primary_alias_id` FROM `courses_cours
e` WHERE `courses_course`.`id` = 2079 ; args=(2079,)
...

有人可以解释为什么会这样吗?我想不出任何可以解释它的东西。

【问题讨论】:

  • 你如何调整管理员?
  • 没什么意义——只是添加 ModelAdmins 以启用搜索和过滤等。我在开始之前就注意到了这种影响,很可能是我之前的某个人负责——但我真的猜不出从哪里开始寻找。
  • 我想我以前见过这种行为。原因:我没有在查询中使用 select_related
  • 所以简单地将其设置为 true 并没有多大帮助,但至少这是一个有用的线索。
  • 设置为true是什么意思? select_related 是一个 QuerySet 方法。看看select_related

标签: django django-admin


【解决方案1】:

我在这里找到了答案:Improving Performance of Django ForeignKey Fields in Admin

因为 Django 将外键列为select 列表,所以它必须查询每一个。看起来有几种解决方案是可能的,但最简单的是将字段设置为raw_id field。 (事实上​​,这样做解决了我的问题。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-11-13
    • 2012-12-24
    • 2012-11-15
    • 2018-11-16
    • 1970-01-01
    • 2018-03-22
    • 1970-01-01
    相关资源
    最近更新 更多