【问题标题】:How to reduce for loops in html in Django?如何减少 Django 中 html 中的 for 循环?
【发布时间】:2022-01-25 20:13:30
【问题描述】:

我在 django html 中尝试了以下 for 循环和 if 语句,但加载一页需要很长时间。首先,这里是html:

                       {% for time in TIME_CHOICES %}

                        <tr class="bg-white border-b border-gray-400">
                            <td class="border-r border-gray-400 py-1 whitespace-nowrap text-sm font-medium text-gray-900">
                                {{time}}
                            </td>
                            {% for each_date in dates_in_month %}
                            {% if each_date not in weekends %}
                                {% for class in classes %}
                                 <h1>class</h1>
                                {% endfor %}
                            {% else %}
                            <td class="py-1 whitespace-nowrap text-sm text-gray-500">
                                <ul class="list-none" style="font-size: 0.70rem; line-height: 0.85rem;">
                                    <li>-----</li>
                                    <li>--(--)</li>
                                </ul>
                            </td>
                            {% endif %}
                            {% endfor %}
                        </tr>

                        {% endfor %}

我认为这是因为我的 html 中有太多的 for 循环和 if 语句。无论如何我可以提高速度吗?或者有什么方法可以在 django 视图中做同样的事情(我使用的是通用列表视图,所以我需要一些代码用于get_context_data)?谢谢,如有任何问题,请留下。

【问题讨论】:

  • 不是current_classes = classes.filter(date=each_date) 每天都进行数据库查询,而是对所有天进行一次查询,然后在 Python 中对其进行排序?

标签: django django-models django-views django-forms django-templates


【解决方案1】:

减少数据库命中总是更好。在您的代码中,您在迭代中访问数据库,因此如果循环运行 1000 次,它将访问数据库 1000 次,这可以减少为只有一个查询,如下所示:

classes = Class.objects.filter(
      teacher=teacher, date__in=[each_date for each_date in dates_in_month 
                                 if each_date not in weekends]
      ).order_by('date','time')

然后您可以迭代 classes 查询集以继续执行其余代码。

同时让你的代码更具可读性,现在它很混乱。

【讨论】:

    【解决方案2】:

    很难说代码中的性能问题在哪里。 html 中的循环不应该花费很多时间。也许你有很多数据库查询或运行一些繁重的方法。

    尝试调查代码的哪一部分确实很慢。你可以Silk profiler这个

    Silk 是 Django 框架的实时分析和检查工具。 Silk 拦截并存储 HTTP 请求和数据库查询,然后将它们呈现在用户界面中以供进一步检查:

    安装

    pip install django-silk
    

    在settings.py 中添加以下内容:

    MIDDLEWARE = [
        ...
        'silk.middleware.SilkyMiddleware',
        ...
    ]
    
    INSTALLED_APPS = (
        ...
        'silk'
    )
    

    尝试找出最耗时的方法并进行优化。此外,您可以将 Silk 的结果添加到您的问题中。它有助于找出问题

    【讨论】:

    • dates_in_month、weekends 和 classes 都是我从通用列表视图中的 get_context_data 获得的查询集。这就是为什么我的加载时间很慢?我可以从字面上看到列表被创建了 10 秒。
    • @codebuilder 是的,我敢打赌。尝试在您的视图中转换 weekends = list(weekends) 以将查询移出模板。另外,请分享此查询的代码。
    • 我添加了所有“原始”代码,而不是放置简化版本。我希望你能看看。
    • 特别是周末,你也可以试试weekends = set(weekends)和weekends = list(weekends)比较性能;不太可能有很大的不同,但其中一个可能会更快
    猜你喜欢
    • 1970-01-01
    • 2013-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-22
    • 2018-03-27
    • 1970-01-01
    相关资源
    最近更新 更多