django:为啥在模板中获取模型的 .id 字段很慢?
Posted
技术标签:
【中文标题】django:为啥在模板中获取模型的 .id 字段很慢?【英文标题】:django: why is getting model's .id field in template slow?django:为什么在模板中获取模型的 .id 字段很慢? 【发布时间】:2011-11-18 03:18:50 【问题描述】:我有一个模板,它最终会输出大约 700 个输入元素,如下所示:
<input class="ticket" size="3" maxlength="15" type="text" name=" ticket.id ">
连同调用视图函数和渲染模板(生成 html,但不计算浏览器渲染时间),大约需要 1.5 秒。我正在优化模板以查看花费时间最长的内容,因为还有很多其他更复杂的事情正在发生……我意识到如果我删除了 ticket.id
部分,渲染时间会下降到 ~0.48 秒。我什至在票模型上做了一个函数:
def get_input_name(self): return str(self.id)
并替换了模板中的行:
<input class="ticket" size="3" maxlength="15" type="text" name=" ticket.get_input_name ">
这产生了相同的输出,大约为 0.52 秒。
为什么调用 ticket.id
这么慢?
【问题讨论】:
可能是因为它进行了额外的 SQL 调用,虽然不太确定,但尝试使用类似 pypi.python.org/pypi/django-debug-toolbar-django13/0.8.4 的东西进行分析 您使用的是什么后端,您的票证模型中有多少行? @nicolas:postgresql,我的票证模型中有 10 个字段 @Claudiu:例如,您是否对 sqlite 有此问题? @nicoals:不确定,我只用 postgresql 试过 【参考方案1】:尝试查看正在执行的 SQL 查询。从 shell (./manage.py shell
) 试试这个:
from django.db import connection
from pprint import pprint
from django.http import HttpRequest
from myproject.myapp.views import myview
f = open('/tmp/queries.txt','w')
myview(HttpRequest(), whatever_other, args_you_need)
pprint(connection.queries, f)
f.close()
然后查看/tmp/queries.txt
并查看实际进行了哪些查询。每个查询也将有它花费的时间。如果您没有看到任何异常(例如每次通过模板循环的查询),那么您的问题可能不是数据库,我不知道。
【讨论】:
以上是关于django:为啥在模板中获取模型的 .id 字段很慢?的主要内容,如果未能解决你的问题,请参考以下文章
如何从用户在 django 基本模板中创建的所有帖子中获取模型字段值的总和?