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 基本模板中创建的所有帖子中获取模型字段值的总和?

django模型,如何动态设置查询的字段?

Django模板:从模型查询集对象中提取字段

为啥 Django 模板不能从对象字段中识别列表?

django:自相关 ForeignKey 字段的相关名称不起作用 |在模板中获取相反方向的自引用

在 Django 中,为啥模型中的 blank=True 不会使表单字段不是强制性的?