Django:优化查询的最佳方法

时间:2020-07-15 20:23:28

标签: django query-optimization

我在网页查询中遇到问题,索引页显示5行,具有5种不同的类别,我的表看起来像这样

models.py

class Post(models.Models):
    ....
    categories = M2M(Category, ...)
    author = FK(author, ...)
    status = CharField(Choices=STATUS)

views.py 在这里,我将提取数据的方式发送给模板

queryset_global = Post.objects.filter(status__contains='publish').prefetch_related('categories').select_related('author')

根据我的说法,我缓存了查询,以便稍后过滤我的类别而不访问数据库

news_cat1 = queryset_global.filter(categories__slug__contains="cat1_name").order_by('-date')[:5]
news_cat2 = queryset_global.filter(categories__slug__contains="cat2_name").order_by('-date')[:5]
news_cat3 = queryset_global.filter(categories__slug__contains="cat3_name").order_by('-date')[:5]
news_cat4 = queryset_global.filter(categories__slug__contains="cat4_name").order_by('-date')[:5]
news_cat5 = queryset_global.filter(categories__slug__contains="cat5_name").order_by('-date')[:5]

我检索了25条帖子以在索引页中显示

根据调试工具栏生成SQL 2599.59毫秒(44个查询,包括34个重复项)

但是当我在模板中循环播放它们时,它会大大增加

index.html模板中的5个时间循环

{% for news1 in news_cat1 %}
    {{news.title}}
    {{newa.date|date:'Y-m-d'}}
    {{news.body|safe|truncatewords:20}}
    {{news.category.all.0}}
    <a href="{{news.get_absolute_url}}">Read More</a>
{% endfor %}
...
{% for news5 in news_cat5 %}
   ....
{% endfor %}

根据调试工具栏生成SQL 3463.65毫秒(86个查询,包括77个重复项)

为什么调试工具栏会说N个重复项并显示更多查询,而如果我显示更多类别,则会增加更多查询。

我该如何改善或优化这些查询,它们过于密集并且调试工具栏告诉我有重复项,这意味着有人可以向我解释

0 个答案:

没有答案