首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Django模板中优化循环?

如何在Django模板中优化循环?
EN

Stack Overflow用户
提问于 2019-08-15 01:12:03
回答 1查看 239关注 0票数 0

我有一个数据库设置,其中我有以下模式:

主要的模型是Group。每组下都有任意数量的规则。每条规则包含任意数量的Regex和联系人。

我将整个设置显示在主页面下,所以它看起来像这样:

代码语言:javascript
复制
Group A
 - Rule A
   - Regex 1, Contact 1, Contact 2
   - Regex 2, Regex 3, Contact 3

 - Rule B
   - Regex 5, Regex 6,  Regex 6, Contact 4
   - Regex 7, Contact 7, Contact 6


Group B
 - ...

db查询本身并不是非常复杂。它基本上是:

代码语言:javascript
复制
    for group in groups:
        r = Rule.objects.filter(group=group)
        rules[group]= r

但是模板渲染是让事情变慢的原因。由于嵌套循环的数量,渲染模板大约需要7秒:

代码语言:javascript
复制
{% for group, rules in rules.items %}
        {% for rule in rules %}
                {% for regex in rule.regexes.all %}
                    {{regex.name}}
                    {{regex.type}}
                    {{...}}
                {% endfor %}

                {% for contacts in rule.contacts.all %}
                    {{contacts.name}}
                    {{contacts.email}}
                    {{...}}
                {% endfor %}

        {% endfor %}

{% endfor %}

这里显然有更多的HTML,但即使没有它,渲染也需要大约3-4秒(完整的模板大约需要7秒)。作为参考,大约有400个规则,每个规则有1-5个正则表达式和1-5个联系人。有没有什么方法可以提高渲染的速度,而不必进行分页?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-08-15 01:22:51

问题不在于嵌套循环本身,而在于这些循环触发的数据库查找。您可以在初始查询中使用prefetch_related进行优化。

代码语言:javascript
复制
r = Rule.objects.filter(group=group).prefetch_related('regexes', 'contacts')

尽管您可能还想优化初始循环,但您应该能够一次完成所有操作。类似于:

代码语言:javascript
复制
groups = Group.objects.all().prefetch_related('rules__regexes', 'rules__contacts')
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57499219

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档