循环渲染的 Django 模板查询花费了太多时间

Posted

技术标签:

【中文标题】循环渲染的 Django 模板查询花费了太多时间【英文标题】:Django template query for loop render taking too much time 【发布时间】:2020-09-18 11:08:56 【问题描述】:

我有一个对象的限制 10 的相关查询。在开发模式下加载整个页面需要 9s 以上。当我没有在模板上运行相关的循环查询时,加载只需 1 秒。我很困惑这里发生了什么!请帮我找出问题/我在这里做错了什么!提前致谢!

这是我的视图文件代码 -

related = News.objects.filter(
            is_active=True,
            status='public',
            language=request.LANGUAGE_CODE,
            category=news.category
        ).order_by('-published_at')[:10]

这是模板文件的循环 -

% for r in related %
    <li class="row mb-4">
        <a href="% url 'single_news' r.id %" class="col-5">
            <img src=" r.featured_image.url "  class="rounded img-fluid">
        </a>
        <div class="col-7">
            <a href="% url 'single_news' r.id %" class="no-underline">
                <h6 class="mb-3 h5 text-charcoal"> r.heading </h6>
            </a>
            <div class="d-flex text-small">
                <span class="text-muted ml-1"> r.published_at </span>
            </div>
        </div>
    </li>
% endfor %

这是查询时间的 django-debug-ttolbar 图片 -

【问题讨论】:

【参考方案1】:

数据库中有多少个新闻对象?如果您有很多,并且您在基础where 子句或order_by 子句中的列上没有索引,则可能需要很长时间才能获得这 10 个新闻项目。您可以直接访问数据库吗?我会尝试该查询的 SQL,看看查询是否需要很长时间:

SELECT * FROM content_news WHERE is_active=1 AND status='public' AND language='bn' ORDER_BY published_at DESC

我注意到屏幕截图中的查询没有category=news.category 子句。类别是外键吗?如果是这样,您可能希望使用select_related 来有效地检索它。

希望对您有所帮助,祝您编码愉快!

【讨论】:

大约 400k 个对象。是的,类别是类别表的外键。你能举一个'selected_related'的例子/参考吗,我以前从来没有用过那个。非常感谢您的帮助,谢谢。

以上是关于循环渲染的 Django 模板查询花费了太多时间的主要内容,如果未能解决你的问题,请参考以下文章

嵌套的 Foreach 循环花费了太多时间

使用标量函数执行查询花费了太多时间

查询花费了太多时间与恼人的性能[关闭]

在 MySQL 中进行排序时查询花费了太多时间

从 Sqlite 游标创建 Pojo 类花费了太多时间

Hibernate 花费了太多时间并执行了一些神秘的操作。