在企业级Django应用开发中,模板性能往往是影响用户体验的关键瓶颈。本文将通过实际案例分析Django模板的常见性能问题,并提供优化方案。
问题复现
首先,让我们创建一个典型的性能问题场景:
# views.py
from django.shortcuts import render
from .models import Product, Category
def product_list(request):
# 这里存在N+1查询问题
products = Product.objects.all()
categories = Category.objects.all()
return render(request, 'products/list.html', {
'products': products,
'categories': categories
})
<!-- products/list.html -->
{% for product in products %}
<div>
<h3>{{ product.name }}</h3>
<p>分类: {{ product.category.name }}</p>
<!-- 每次循环都执行数据库查询 -->
</div>
{% endfor %}
性能分析
使用Django Debug Toolbar可以观察到,上述代码会产生大量重复的数据库查询。在有100个产品的情况下,会执行100次额外的查询来获取分类信息。
优化方案
1. 使用select_related
def product_list(request):
products = Product.objects.select_related('category').all()
categories = Category.objects.all()
return render(request, 'products/list.html', {
'products': products,
'categories': categories
})
2. 使用prefetch_related处理多对多关系
# 对于多对多关系
products = Product.objects.prefetch_related('tags').all()
3. 模板缓存优化
{% load cache %}
{% cache 500 sidebar %}
<!-- 复杂的侧边栏内容 -->
{% endcache %}
性能对比
通过以上优化,查询次数从N+1降低到1次,页面加载时间减少80%以上。

讨论