Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/silverlight/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django-queryset拆分为4,会对数据库造成大量的点击_Python_Django_Django Templates_Django Database - Fatal编程技术网

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