You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django模板渲染大量QuerySet速度过慢问题求助

Django工单仪表盘大量数据加载优化方案

一、先修复分页逻辑(核心前提)

你的分页实现错误导致切换页面仍执行全量查询,这是首要问题,先解决这个才能从根源减少渲染的数据量:

  • 确保使用Django内置的Paginator和Page类,在视图中仅查询当前页需要的数据:
    from django.core.paginator import Paginator
    
    def dashboard(request):
        # 仅加载需要渲染的5个字段,避免冗余数据
        ticket_list = Ticket.objects.all().only('field1', 'field2', 'field3', 'field4', 'field5')
        paginator = Paginator(ticket_list, 50)  # 每页条数可根据实际场景调整
        page_number = request.GET.get('page')
        page_obj = paginator.get_page(page_number)
        return render(request, 'dashboard.html', {'page_obj': page_obj})
    
  • 模板中遍历page_obj而非全量数据集,同时添加分页导航组件,确保每次请求仅获取当前页的数据集。

二、模板渲染优化(针对循环慢的问题)

当查询耗时可忽略但页面加载久时,模板循环渲染是主要瓶颈,可通过以下方式优化:

  • 提前在视图中预处理数据:把所有需要在模板中展示的格式化、状态转换等逻辑,提前在视图层完成,避免在循环内重复执行运算:
    # 视图中预处理字段
    for ticket in ticket_list:
        ticket.formatted_create_time = ticket.create_time.strftime('%Y-%m-%d %H:%M')
        ticket.status_text = '已完成' if ticket.status == 1 else '处理中'
    
  • 使用with标签缓存重复访问的属性:在循环内用{% with %}缓存字段值,避免重复访问对象属性带来的开销:
    {% for ticket in page_obj %}
        {% with fmt_time=ticket.formatted_create_time status=ticket.status_text %}
            <tr>
                <td>{{ ticket.id }}</td>
                <td>{{ fmt_time }}</td>
                <td>{{ status }}</td>
                <!-- 其他字段渲染 -->
            </tr>
        {% endwith %}
    {% endfor %}
    
  • 切换至Jinja2模板引擎:Jinja2的循环渲染性能优于Django默认模板引擎,配置替换后可直接兼容现有模板语法,大幅提升大量数据的渲染速度。
  • 禁用模板调试模式:生产环境下确保settings.py中DEBUG=False,关闭模板调试相关的额外开销。

三、前端辅助优化

  • 给表格添加虚拟滚动:使用前端库(如react-window、vue-virtual-scroller)实现虚拟滚动,仅渲染可视区域内的DOM节点,避免大量DOM元素导致的页面卡顿。
  • 启用Gzip压缩:在IIS中配置静态资源和页面的Gzip压缩,减少页面传输大小。

内容的提问来源于stack exchange,提问作者David

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 14:12:44