2016-07-04 5 views
1

Я использую Django-Tables2 со следующим кодом для загрузки данных в таблицы данных.Использование Django-фильтра на больших таблицах вместе с DataTables2

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

Моя таблица продаж имеет 1,4 миллиона строк и тем не менее, выше метод RequestConfig на (django_tables2.Table) очень быстро с нумерацией страниц и т.д.

Теперь я хочу, чтобы иметь фильтрацию столбцов на таблицу и использование django-фильтра для того же самого. Это занимает слишком много времени, потребляя целую память. Есть ли способ, я могу получить фильтрацию как скорость, как обычная загрузка таблицы?

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 

Заранее спасибо!

+0

почему вам нужно использовать Джанго фильтр? что случилось со встроенными фильтрами? – e4c5

+0

Набор запросов Django-Filter определяет фильтрацию динамического столбца на основе формы фильтра, и нам не нужно повторно изобретать все для всех типов полей. –

+0

есть ли у вас лучшая причина, что торговый шарф? – e4c5

ответ

2

В CBV вместо фильтра необходимо передать filter.qs. В предыдущем случае вся таблица загружается в память, и, следовательно, время загрузки больше и происходит сбой браузера.

С этой модификацией оба пустых фильтра & наборов запросов на фильтрах загружаются с помощью запроса 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 

Ссылка

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

+0

Просто любопытно ... что такое «CBV»? –

+0

@JasonCapriotti В Django классные взгляды кратко обозначаются как CBV. –