Django - queryset分为4,导致数据库的很多命中 [英] Django - queryset split to 4, causes lots of hits to the database
问题描述
这是我的模板标签:
@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屋!