禁用分页器时如何防止将行计数发送到数据库
How to prevent a row count from being sent to the db when paginator is disabled
我正在使用 Django 1.11,Django-tables2 1.19.0 和 MS SQL 通过 django-pyodbc-azure 1.11.0.0.
我正在展示一个 table 模型,该模型的视图相当慢,不幸的是,它必须对每一行进行 运行 子查询。我无法更改视图,因此我禁用了 tables2 的分页器并做了一个切片来限制视图子查询将 运行 on:
的行数
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,但我在过去几天的各种误入歧途的尝试都遭遇了可怕的失败。
对于这方面的任何帮助,我将不胜感激。谢谢
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
这是 a bug in django-tables2 and should be fixed with commit 942f05e。
修复发布为 version 1.21.1。
我正在使用 Django 1.11,Django-tables2 1.19.0 和 MS SQL 通过 django-pyodbc-azure 1.11.0.0.
我正在展示一个 table 模型,该模型的视图相当慢,不幸的是,它必须对每一行进行 运行 子查询。我无法更改视图,因此我禁用了 tables2 的分页器并做了一个切片来限制视图子查询将 运行 on:
的行数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,但我在过去几天的各种误入歧途的尝试都遭遇了可怕的失败。
对于这方面的任何帮助,我将不胜感激。谢谢
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
这是 a bug in django-tables2 and should be fixed with commit 942f05e。
修复发布为 version 1.21.1。