2016-07-04 5 views
1

データテーブルにデータをロードするために、次のコードでDjango-Tables2を使用しています。DataTable2と一緒に大きなテーブルでDjango-Filterを使用する

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

私の販売テーブルには、140万行を持っており、まだ、上の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

は、なぜあなたはDjangoのフィルタを使用する必要がありますか?組み込みのフィルタで何が問題になっていますか? – e4c5

+0

Django-Filterのクエリセットは、フィルタフォームに基づいて動的列フィルタリング自体を定義しており、すべてのフィールドタイプについてすべてを再作成する必要はありません。 –

+0

あなたはより良い理由がありますか? – e4c5

答えて

2

CBVでは、filterの代わりに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と略されています。 –

関連する問題