Django-queryset拆分为4,导致对数据库的大量点击

问题描述 投票:2回答: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

这是我在模板中的伪用法:

{% 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表示形式。但这对我的数据库也很不利。首先,它评估完整的查询集,然后每一列都获得其自己的评估,如何优化它?

我正在使用缓存,但是我仍然想知道如何在比缓存低的水平上对其进行优化。

python django django-templates django-database
4个回答
2
投票

在处理所有数据时,必须处理至少一个返回所有数据的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

1
投票
@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

1
投票

您为什么不使用divisibleby

divisibleby

0
投票

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 %}
© www.soinside.com 2019 - 2024. All rights reserved.