【问题标题】: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 试过

标签: django performance optimization django-models django-templates


【解决方案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 并查看实际进行了哪些查询。每个查询也将有它花费的时间。如果您没有看到任何异常(例如每次通过模板循环的查询),那么您的问题可能不是数据库,我不知道。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-10-12
    • 2020-07-07
    • 2020-07-13
    • 2017-11-11
    • 2012-10-22
    • 2011-04-08
    • 1970-01-01
    • 2012-03-02
    相关资源
    最近更新 更多