Использование Django-Filter на больших таблицах вместе с DataTables2

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

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

В моей таблице продаж 1,4 миллиона строк, и все же указанный выше метод RequestConfig on (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

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


person Satish V Madala    schedule 04.07.2016    source источник
comment
зачем вам использовать фильтр django? что не так со встроенными фильтрами?   -  person e4c5    schedule 05.07.2016
comment
Набор запросов Django-Filter определяет саму фильтрацию динамических столбцов на основе формы фильтра, и нам не нужно заново изобретать все для всех типов полей.   -  person Satish V Madala    schedule 05.07.2016
comment
есть ли у вас более веская причина, чем обменять пуховку?   -  person e4c5    schedule 05.07.2016
comment
@ e4c5 Используя Django-filter, настраивать / вставлять новые фильтры и типы довольно просто. Я заметил, что при таком подходе время загрузки для нескольких таблиц значительно сокращается.   -  person Satish V Madala    schedule 05.07.2016


Ответы (1)


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

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

person Satish V Madala    schedule 05.07.2016
comment
Просто любопытно ... что такое CBV? - person Jason Capriotti; 18.01.2017
comment
@JasonCapriotti В Django представления на основе классов сокращенно называются CBV. - person Satish V Madala; 01.06.2017