Python Django-queryset拆分为4,会对数据库造成大量的点击
这是我的模板标签:Python Django-queryset拆分为4,会对数据库造成大量的点击,python,django,django-templates,django-database,Python,Django,Django Templates,Django 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 以下是我在模板中的伪用法: {% for column
@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 %}
{queryset中列的百分比|拆分为4列%}
{%列中的对象为%}
{%endfor%}
{%endfor%}
它基本上将我的长查询集(几百个对象)分成4列,以获得更好的html表示。但它似乎也对我的数据库造成了沉重打击。首先,它评估完整的查询集,然后每个列都得到自己的评估,如何优化它
我正在使用缓存,但我仍然想知道如何在比缓存更低的级别上对其进行优化。当您处理所有数据时,必须处理至少一个
选择返回所有数据。要查询一次数据,您可以在第一步请求所有数据(计算queryset),然后在第二步使用纯python(不命中DB)拆分数据:
@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
处理所有数据时,必须至少处理一个返回所有数据的select
。要查询一次数据,您可以在第一步请求所有数据(计算queryset),然后在第二步使用纯python(不命中DB)拆分数据:
你为什么不使用
{%for queryset%中的对象]
{%if-forloop.counter |可除数为:“4”%}
{%endif%}
{%if-forloop.counter |可除数为:“4”%}
{%endif%}
{%endfor%}
为什么不使用
{%for queryset%中的对象]
{%if-forloop.counter |可除数为:“4”%}
{%endif%}
{%if-forloop.counter |可除数为:“4”%}
{%endif%}
{%endfor%}
Django提供了几个类,可帮助您管理分页数据,即通过“上一页/下一页”链接拆分的数据:
from django.core.paginator import Paginator
Django提供了几个类,可帮助您管理分页数据,即通过“上一页/下一页”链接拆分的数据:
from django.core.paginator import Paginator
此拆分与OP使用的拆分不同;如果条件为i=(i+1)%4,则可以删除,该拆分与OP使用的拆分不同;您可以删除,如果i=(i+1)%4的条件刚刚注意到这个答案。这是一种有趣的方法。为什么有两个相同的“如果”?我什么时候才能关掉?抱歉,修好了。不,我还是不明白。它每4项启动一次列表。我想要4个div,而不是queryset/4 div。编辑:完全迷路了,需要一点时间来测试:]不,这不是我想要的。但很高兴知道有这个内置标签,谢谢。刚刚注意到这个答案。这是一种有趣的方法。为什么有两个相同的“如果”?我什么时候才能关掉?抱歉,修好了。不,我还是不明白。它每4项启动一次列表。我想要4个div,而不是queryset/4 div。编辑:完全迷路了,需要一点时间来测试:]不,这不是我想要的。但是很高兴知道有这个内置标签,谢谢。
from django.core.paginator import Paginator