我有一个数据库设置,其中我有以下模式:
主要的模型是Group。每组下都有任意数量的规则。每条规则包含任意数量的Regex和联系人。
我将整个设置显示在主页面下,所以它看起来像这样:
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查询本身并不是非常复杂。它基本上是:
for group in groups:
r = Rule.objects.filter(group=group)
rules[group]= r但是模板渲染是让事情变慢的原因。由于嵌套循环的数量,渲染模板大约需要7秒:
{% 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个联系人。有没有什么方法可以提高渲染的速度,而不必进行分页?
发布于 2019-08-15 01:22:51
问题不在于嵌套循环本身,而在于这些循环触发的数据库查找。您可以在初始查询中使用prefetch_related进行优化。
r = Rule.objects.filter(group=group).prefetch_related('regexes', 'contacts')尽管您可能还想优化初始循环,但您应该能够一次完成所有操作。类似于:
groups = Group.objects.all().prefetch_related('rules__regexes', 'rules__contacts')https://stackoverflow.com/questions/57499219
复制相似问题