当前位置: 首页 > 知识库问答 >
问题:

python - django前端分类页面需要查询100多条SQL,如何优化?

南宫才英
2023-06-24

页面是根据title查询到一级分类,然后在通过一级分类获取所有的二级分类,再获取二级分类下图片的总数。
但是这一个一名就造成了100多套SQL查询,请问前辈,这个应该如何优化?
image.png

view层代码如下:

class CategorysTagView(CommonView):
    def get(self, request, title):
        # 根据名称查询一级分类
        category =  models.TopCategory.objects.prefetch_related('topcategory').get(title_en=title)
        return render(request, 'category.html', category)

模板层渲染代码如下

<div class="row">
            {#获取分类下所有图片#}
            {% for item in category.topcategory.all %}
                <div class="col-md-3 col-6 mb-4">
                    <div class="p-3 bg-white">
                        <a href="{% url 'category-all' item.id %}" target="_blank">
                            <h1 class="card-title text-truncate font-weight-bold"><span
                                    class="badge badge-primary rounded-0 mr-2">{{ title.title_zh }}</span>{{ item.title_zh }}
                            </h1>
                        </a>
                        <div class="d-flex justify-content-between ">
                            <small class="card-text text-truncate"><i class="bi bi-folder"></i> 共有
                                <b>{{ item.categorytag.count}}</b> 张{{ item.title_zh }}素材</small>
                        </div>
                    </div>
                </div>
            {% endfor %}
        </div>

其中模板层的{{ item.categorytag.count}}会造成大量的SQL请求,如果去掉这个查询,页面仅有5个SQL

共有1个答案

狄望
2023-06-24
from django.db.models import Count

class CategorysTagView(CommonView):
    def get(self, request, title):
        # 根据名称查询一级分类,并预先计算每个二级分类的图片数量
        category = models.TopCategory.objects.prefetch_related(
            models.Prefetch(
                'topcategory',
                queryset=models.SecondCategory.objects.annotate(image_count=Count('categorytag'))
            )
        ).get(title_en=title)
        return render(request, 'category.html', category)

然后:


<small class="card-text text-truncate"><i class="bi bi-folder"></i> 共有
    <b>{{ item.image_count }}</b> 张{{ item.title_zh }}素材</small>
 类似资料:
  • 本文向大家介绍django 前端页面如何实现显示前N条数据,包括了django 前端页面如何实现显示前N条数据的使用技巧和注意事项,需要的朋友参考一下 这个涉及到的知识点是django数据库查询问题,我们可以在view.py文件中操作 blog_list = models.Blog.objects.all()[:3] 这是选取数据库的前三条数据 补充知识:django 数据库查询—如何获取指定范围

  • 我现在在大学学习数据库,在我的项目中,我有3个表:、和 联赛(leagueId,leagueName) 团队(teamId,teamName) 具有(leagueId,teamId,year)

  • 本文向大家介绍JPA多条件复杂SQL动态分页查询功能,包括了JPA多条件复杂SQL动态分页查询功能的使用技巧和注意事项,需要的朋友参考一下 概述   ORM映射为我们带来便利的同时,也失去了较大灵活性,如果SQL较复杂,要进行动态查询,那必定是一件头疼的事情(也可能是lz还没发现好的方法),记录下自己用的三种复杂查询方式。 环境 springBoot IDEA2017.3.4 JDK8 pom.x

  • 问题内容: 我有一个查询,使用带通配符的“ like”来搜索客户端。例如: 它还可以在“ where”子句中使用较少的参数,例如: 谁能说出优化这种查询性能的最佳方法是什么?也许我需要创建一个索引?该表在生产中最多可以有1000K条记录。 问题答案: 要在模式具有表单的位置上做很多事情,您需要查找SQL Server的全文本索引功能,并使用代替。照原样,您正在执行全表扫描,因为普通索引对搜索以通配

  • 问题内容: 我正在尝试按日期对我的讨论区中的帖子进行排序。这是我的代码: 这在语法上有什么问题吗?如果没有,还有什么可能是错误的?基本上发生的是结果没有显示出来。我删除了Order,它可以工作(但当然没有排序…) 问题答案: 订购应超出限制:

  • 我有这张桌子: 这是我的SQL查询: 我想要的查询是: > 我希望获得符合某些条件的记录,特别是字段在最近24小时内的记录 我需要获得紧接在#1中的记录之前的记录 将#1中的结果进一步过滤到其价格列在记录的历史记录中具有不同值(而不是-1)的记录 我面临的问题是查询太慢了。我有一百万张唱片。执行查询大约需要2分钟。我猜GROUP BY会使查询变慢。我想我需要做一个综合指数,但我不知道怎么做。 解释