Django模板:我应该传递一个完整的对象还是提取字符串?

时间:2010-11-17 19:30:32

标签: django django-templates performance

我正在Django中加载一个页面,该页面汇总了来自一堆数据库对象的信息。这需要永远加载,当我逐步浏览视图代码时,数据库处理很快,这只是一个永远需要的render_to_response调用。

传递给模板的上下文中包含一堆数据库对象,因此可能会显示这些对象的某些部分。这有什么开销吗?另一种方法是从对象中提取特定字符串,并仅将这些字符串添加到上下文中。我对模板系统知之甚少,不知道这是否会对渲染模板所需的时间长度产生影响。我可以看到它产生了很大的影响,或者完全没有影响,或者介于两者之间的任何地方。


作为后续行动,我们网站性能下降的实际原因是由于我们链接到谷歌的一些jQueryUI脚本。当我下载它们并在本地安装它们时,之前加载超过一分钟的页面现在需要3秒钟。 Django工具栏帮助诊断了这个问题,因为我可以看到SQL查询不是瓶颈。

3 个答案:

答案 0 :(得分:3)

视图中的内容不是“数据库处理代码”,而是“QuerySet生成代码”。是的,那很快。但是,当实际命中数据库并检索行时,需要时间。打开数据库中的日志记录,找出哪些查询花费的时间太长,以及哪些查询可以不用。

答案 1 :(得分:1)

Django的渲染引擎非常快。我原以为,由于从对象中获取这些值的过程必须在某个时刻完成,所以应该在正确的位置(模板)完成。

也许你的算法效率低下?

答案 2 :(得分:1)

扩展Ignacio的观点:仅仅因为在视图中定义了查询集,并不意味着它们在那里被评估。大多数情况下,在访问或迭代它们之前不会对它们进行评估:这通常发生在模板中。所以在模板中可能存在数据库访问,这可能是花费时间的。

与往常一样,我建议使用Django debug toolbar - 它将准确显示数据库访问的确切位置。