Django - queryset分为4,导致数据库的很多命中 [英] Django - queryset split to 4, causes lots of hits to the database

查看:139
本文介绍了Django - queryset分为4,导致数据库的很多命中的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

这是我的模板标签:

@register.filter
def split_to_4_columns(queryset):
    split = int(ceil(queryset.count()/4.))
    columns = list()
    for i in range(4):
        columns.append(queryset[i*split:(i+1)*split])
    return columns

这里是我的模板中的伪使用:

And here is my pseudo usage in templates:

{% for column in queryset|split_to_4_columns %}
<div class="list">
    {% for object in column %}
    <a href="{{ object.get_absolute_url }}" class="item">{{ object }}</a>
    {% endfor %}
</div>
{% endfor %}

它基本上将我的长查询(几百个对象)分成4列更好的html演示文稿。但是也似乎在我的数据库上受到重创。首先,它评估完整的查询,然后每一列都得到自己的评估,如何优化?

It basically splits my long querysets (few hundreds objects) into 4 columns for a better html presentation. But it also appears to hit hard on my database. First it evaluates the full queryset, and then every column gets it's own evaluation, how can I optimize it?

我正在使用缓存,但是我仍然希望知道如何在较低级别优化缓存。

I am using caching, but still, I'd like to know how can I optimize it on a lower level than just caching.

推荐答案

在处理所有数据时,至少有一个 select 返回所有数据必须处理。要查询数据一次,您可以在第一步请求所有数据(评估查询),并在第二次分割纯粹的python(不打DB):

As you process all the data, at least one select returning all the data must be processed. To query data once, you can on first step request all the data (evaluate queryset) and on the second split it with pure python (not hitting DB):

@register.filter
def split_to_4_columns(queryset):
    values = list(queryset.all())
    split = int(ceil(len(values)/4.))
    columns = [values[i*split:(i+1)*split] for i in range(4)]
    return columns

这篇关于Django - queryset分为4,导致数据库的很多命中的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆