在大型表和DataTables2上使用Django-Filter

时间:2016-07-04 20:18:32

标签: python django datatables django-filter django-tables2

我正在使用带有以下代码的Django-Tables2将数据加载到数据表中。

sales_data = SalesTable(sale.objects.all().order_by('-time'))
RequestConfig(request,paginate={'per_page': 50}).configure(sales_data)

我的销售表有140万行但是,上面的RequestConfig方法(django_tables2.Table)非常快,分页等。

现在,我希望在表上进行列过滤,并使用django-filter进行相同的过滤。它花费的时间太长,耗费了整个记忆。有没有办法,我可以像正常的表加载那样获得过滤速度吗?

views.py

class FilteredSingleTableView(tables.SingleTableView):
      filter_class = None

      def get_table_data(self):
         queryset_data = super(FilteredSingleTableView, self).get_table_data()
         self.filter = self.filter_class(self.request.GET, queryset = queryset_data)
         return self.filter

      def get_context_data(self, **kwargs):
         context = super(FilteredSingleTableView, self).get_context_data(**kwargs)
         context['filter'] = self.filter
         return context 


class SalesFilteredSingleTableView(FilteredSingleTableView):
      model = sale
      table_class = sales.tables.SaleFilteredTable
      filter_class = sales.filters.SaleFilter

urls.py

url(r'^filtertest$', sales_views.SalesFilteredSingleTableView.as_view() , name='salesfilterview')

filters.py

import django_filters

import sales.models

class SaleFilter(django_filters.FilterSet):
    class Meta:
        model = sales.models.sale

tables.py

import django_tables2 as tables
from sales.models import sale

class SaleFilteredTable(tables.Table):
    class Meta:
        model = sale
        attrs = {"class": "paleblue"}
        per_page = 50

提前致谢!

1 个答案:

答案 0 :(得分:2)

在CBV中,必须传递filter.qs而不是filter。在前一种情况下,整个表被加载到内存中,因此加载时间更长,浏览器崩溃发生。

通过这种修改,空滤波器和放大器都是filterform查询集使用LIMIT Query加载。

<强> views.py

class FilteredSingleTableView(tables.SingleTableView):
filter_class = None

def get_table_data(self):
    queryset_data = super(FilteredSingleTableView, self).get_table_data()
    self.filter = self.filter_class(self.request.GET, queryset = queryset_data)
    return self.filter.qs

def get_context_data(self, **kwargs):
    context = super(FilteredSingleTableView, self).get_context_data(**kwargs)
    context['filter'] = self.filter
    return context 

class SalesFilteredSingleTableView(FilteredSingleTableView):
    model = sale
    table_class = SalesFilteredTable
    template_name = 'sales/sale_list.html'
    filter_class = sales.filters.SaleFilter

<强>参考

https://github.com/carltongibson/django-filter/issues/442

相关问题