如何在禁用paginator时阻止将行计数发送到db

问题描述 投票:3回答:2

我正在使用Django 1.11,Django-tables2 1.19.0和MS SQL通过django-pyodbc-azure 1.11.0.0。

我正在为一个模型显示一个表格,这个模型是一个相当慢的视图,不幸的是,它必须为每一行运行子查询。我无法更改视图,因此我已禁用tables2的paginator并完成切片以限制视图子查询将在其上运行的行数:

def my_view(request):
    queryset = my_model.objects.all()
    table = my_table(queryset.all()[:25])  # <- only get top 25
    RequestConfig(request, paginate=False).configure(table)
    return render(request, 'my_template.html', {'table': table})

我也禁用了列的排序。

但是,当使用django-admin-toolbar时,我可以看到“... COUNT_BIG(*)FROM(SELECT TOP 25 ...”)仍被发送到服务器。

出于性能原因,我想尽可能防止COUNT_BIG,但过去几天我的各种错误尝试都遭遇了可怕的失败。

我真的很感激这个帮助。谢谢。

django python-3.x django-tables2
2个回答
3
投票

这是a bug in django-tables2,应该用commit 942f05e修复。

修复程序以version 1.21.1发布。


-1
投票
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger


class PaginateQueryset(object):
    '''Paginate Queryset'''

    def paginate_query_set(self, queryset, page_size):
        ''' Paginate '''
        page = self.search_params.get('page', 1)
        paginator = Paginator(queryset, page_size)
        try:
            objects = paginator.page(page)
        except PageNotAnInteger:
            objects = paginator.page(1)
        except EmptyPage:
            objects = paginator.page(paginator.num_pages)
        return objects, paginator.count

def my_view(request):
     queryset = my_model.objects.all()
     result, count = PaginateQueryset.paginate_query_set(
                queryset, 25)
     return result, count
© www.soinside.com 2019 - 2024. All rights reserved.