2016-08-17 11 views
0

ユーザのステータスに基づいてWebAPIのページ番号を設定しようとしています。ユーザis_anonymousの場合、クエリパラメータでページサイズを設定できません。私は1つのビュークラスでこれをしようとします。私は2つの異なるビュークラスでそれを行うことができ、そのうちの1つにアクセスを制限することができましたが、これは良い解決策ではないと思います。django rest frameworkでユーザタイプに基づいたページネーションを変更する

ビュークラス:

class WeathermList(generics.ListAPIView): 
    queryset = WeatherMeasurements.objects.all() 
    serializer_class = WeatherMeasurementsSer 
    filter_backends = (filters.DjangoFilterBackend, filters.OrderingFilter,) 
    filter_class = WeatherMeasurementsFilter 
    ordering_fields = ('measure_datetime',) 
    ordering = ('measure_datetime',) 

    @property 
    def paginator(self): 
     """ 
     The paginator instance associated with the view, or `None`. 
     """ 
     if not hasattr(self, '_paginator'): 
      # import ipdb 
      # ipdb.set_trace() 
      if self.request.user.is_anonymous: 
       self._paginator = AnonymousPaginator 
      else: 
       self._paginator = RegisteredPaginator 
     return self._paginator 

ページネーションクラス:

class RegisteredPaginator(PageNumberPagination): 
    page_size = 288 
    page_size_query_param = 'page_size' 
    max_page_size = 10000 


class AnonymousPaginator(PageNumberPagination): 
    page_size = 288 

エラーメッセージ:

File ".../env/lib/python3.5/site-packages/rest_framework/generics.py", line 172, in paginate_queryset 
    return self.paginator.paginate_queryset(queryset, self.request, view=self) 
TypeError: paginate_queryset() missing 1 required positional argument: 'request' 

property paginatorはもともとクラスGenericAPIViewで宣言されています。私はそれを正しく再実装するかどうかはわかりません。両方のカスタムページネーションクラスが設定されているときに動作していますpagination_class

この作業を行うための助けがあれば幸いです。

答えて

2

問題がある:ページネータクラスのインスタンスを必要とself._paginatorなく、クラス自体

それはAnonymousPaginator()RegisteredPaginator()、ないAnonymousPaginatorRegisteredPaginatorでなければなりません。

 if self.request.user.is_anonymous: 
      self._paginator = AnonymousPaginator() 
     else: 
      self._paginator = RegisteredPaginator() 
+0

ああ私の神、どのように恥ずかしい。どうもありがとうございました!このような改ページを使用することをお勧めしますか? –

+1

@ChristianRappうん、それはそれを行う最善の方法です。実際には、私はこの質問のほんの数時間前にそのアプローチを推奨しました:http://stackoverflow.com/questions/38988272/django-rest-framework-drf-how-to-set-pagination-class-depending-on-query -param/38989390#38989390 – levi

関連する問題