我正在使用Django来实现工程管理系统。我在某处做了一些非常错误的事情,并且我的SQL查询计数在某些页面上非常高。
例如,我在一个页面中获得了95到98个SQL查询,这是一个简单的ListView。所有查询都是相同的:
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' %}
我怎样才能摆脱这些额外的开销?
编辑:这是截图:
答案 0 :(得分:1)
在您发布的图片中,堆栈跟踪显示了两个值得注意的事项。
SQL调用正在与django-debug-toolbar相关联的信号处理程序中执行,特别是TEMPLATE面板。
SQL调用将其limit限制子句设置为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',
)
答案 1 :(得分:-1)
看起来你的base.html
模板中有一些循环正在运行数据库。这就是继承这些模板的原因是生成查询。没有看到模板本身就很难说出确切的问题是什么,但这肯定是你会找到答案的地方。