在大表上使用 Django-Filter 以及 DataTables2
Usage of Django-Filter on large tables along with DataTables2
我正在使用带有以下代码的 Django-Tables2 将数据加载到数据 tables。
sales_data = SalesTable(sale.objects.all().order_by('-time'))
RequestConfig(request,paginate={'per_page': 50}).configure(sales_data)
我的销售 table 有 140 万行,但是,上面的 RequestConfig on (django_tables2.Table) 方法在分页等方面非常快
现在,我想对 table 进行列过滤,并使用 django-filter 进行过滤。它花费的时间太长,消耗了整个内存。有没有办法,我可以像正常 table 加载一样快速过滤?
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
提前致谢!
在 CBV 中,必须传递 filter.qs 而不是过滤器。在前面的例子中,整个 table 被加载到内存中,因此加载时间更长,浏览器崩溃发生。
通过此修改,空过滤器和过滤器形式查询集都加载了 LIMIT 查询。
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
参考
我正在使用带有以下代码的 Django-Tables2 将数据加载到数据 tables。
sales_data = SalesTable(sale.objects.all().order_by('-time'))
RequestConfig(request,paginate={'per_page': 50}).configure(sales_data)
我的销售 table 有 140 万行,但是,上面的 RequestConfig on (django_tables2.Table) 方法在分页等方面非常快
现在,我想对 table 进行列过滤,并使用 django-filter 进行过滤。它花费的时间太长,消耗了整个内存。有没有办法,我可以像正常 table 加载一样快速过滤?
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
提前致谢!
在 CBV 中,必须传递 filter.qs 而不是过滤器。在前面的例子中,整个 table 被加载到内存中,因此加载时间更长,浏览器崩溃发生。
通过此修改,空过滤器和过滤器形式查询集都加载了 LIMIT 查询。
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
参考