【问题标题】:Django SQL query for each include/extends每个包含/扩展的 Django SQL 查询
【发布时间】:2013-01-19 01:33:03
【问题描述】:

我正在使用 Django 来实现一个工程管理系统。我在某处确实出错了,并且我的 SQL 查询计数在某些页面上非常高。

例如,我在一个简单的 ListView 页面中获得了 95 到 98 个 SQL 查询。所有的查询都是一样的:

SELECT * FROM "syncoor_codification" LIMIT 21

它们总是返回相同的对象。我怀疑查询是由我的模型的 get_queryset() 函数触发的。

如果我使用 Django 调试工具栏,我可以看到查询是在模板内部触发的,如下所示:

{% extends 'syncoor/base.html' %}
{% extends 'syncoor/docs/base.html' %}
{% extends 'syncoor/docs/codifications/base.html' %}
{% include 'syncoor/js/jsp.js' %}

我怎样才能摆脱这种额外的开销?

编辑:这是截图:

【问题讨论】:

  • 你知道LIMIT 21 来自哪里吗?当您打印查询集时,例如print MyModel.objects.all(),它不会打印所有结果,因为出于舒适目的,它会自动将请求限制为 21。所以我的猜测是你有一些无用的printLIMIT 21 触发这些请求。不过,我不知道为什么它们会被includeextends 触发。
  • 请发布模板并查看源代码。

标签: sql django


【解决方案1】:

您的base.html 模板中似乎有循环正在运行,这些循环正在访问数据库。这就是为什么从这些模板继承会生成查询。如果没有看到模板本身,很难说出确切的问题是什么,但这肯定是您可以找到答案的地方。

【讨论】:

  • Django 调试工具栏还报告由空模板触发的查询!而像 'syncoor/js/jsp.js' 这样的文件不包含任何模板代码
  • 我刚刚尝试关注您的链接,但它被我的办公网络作为“成人内容”屏蔽了!您能否将调试信息直接发布给 SO。
  • 我将图片添加到我的基础帖子中
  • 你能把整个堆栈跟踪部分在屏幕截图上可见吗?
【解决方案2】:

在您发布的图片中,堆栈跟踪显示了 2 个注意事项。

  1. SQL 调用在与 django-debug-toolbar 关联的信号处理程序中执行,特别是 TEMPLATE 面板。

  2. SQL 调用的限制子句设置为 REPR_OUTPUT_SIZE,表明模板面板正在尝试呈现查询集的表示。

这让我相信您已经传递了一个函数或惰性对象,该函数或惰性对象在某个时刻将一个新的查询集返回到上下文中,并且模板面板正在评估这个对象。看看你是否可以在模板面板的上下文中发现一堆实体对象。

要确认,请尝试像这样设置您的设置。

DEBUG_TOOLBAR_PANELS = (
    'debug_toolbar.panels.version.VersionDebugPanel',
    'debug_toolbar.panels.timer.TimerDebugPanel',
    'debug_toolbar.panels.settings_vars.SettingsVarsDebugPanel',
    'debug_toolbar.panels.headers.HeaderDebugPanel',
    'debug_toolbar.panels.request_vars.RequestVarsDebugPanel',
   # 'debug_toolbar.panels.template.TemplateDebugPanel',
    'debug_toolbar.panels.sql.SQLDebugPanel',
    'debug_toolbar.panels.signals.SignalDebugPanel',
    'debug_toolbar.panels.logger.LoggingPanel',
)

【讨论】:

  • 我必须学会更加关注堆栈跟踪... django-debug-toolbar 确实在每次必须为模板呈现上下文时发出查询。非常感谢:)
猜你喜欢
  • 2023-04-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-17
  • 2010-11-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多