这是我的模板标签:
@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
这是我在模板中的伪用法:
{% 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表示形式。但这对我的数据库也很不利。首先,它评估完整的查询集,然后每一列都获得其自己的评估,如何优化它?
我正在使用缓存,但是我仍然想知道如何在比缓存低的水平上对其进行优化。
在处理所有数据时,必须处理至少一个返回所有数据的select
。要查询一次数据,您可以在第一步请求所有数据(评估queryset),然后在第二步使用纯python将其拆分(不打数据库):
@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
@register.filter
def split_to_4_columns(queryset):
i = 0
columns = [[],[],[],[],]
for item in queryset:
columns[i].append(item)
if i == 3:
i = 0
else:
i = i + 1
return columns
您为什么不使用divisibleby
?
divisibleby
Django提供了一些可帮助您管理分页数据的类,即通过“上一页/下一页”链接分为几页的数据:
{% for object in queryset %}
{% if forloop.counter|divisibleby:"4" %}
<div class="list">
{% endif %}
<a href="{{ object.get_absolute_url }}" class="item">{{ object }}</a>
{% if forloop.counter|divisibleby:"4" %}
</div>
{% endif %}
{% endfor %}