2016-08-17 3 views
0

사용자 상태에 따라 WebAPI의 페이지 매김을 설정하려고합니다. 사용자 is_anonymous 사용자는 쿼리 매개 변수로 페이지 크기를 설정할 수 없습니다. 하나의 뷰 클래스를 사용하여이 작업을 수행하려고합니다. 나는 두 개의 서로 다른 뷰 클래스를 사용하여 그것들을 수행 할 수 있었고 그 중 하나에 대한 액세스를 제한 할 수있었습니다.하지만 이것이 좋은 해결책은 아니라고 생각합니다.장고 휴식 프레임 워크로 사용자 유형에 따라 페이지 매김을 변경하십시오.

보기 클래스 :

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 

오류 메시지 :

property paginator
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' 

는 원래 클래스 GenericAPIView에 선언되어있다. 내가 제대로 다시 구현하는지 모르겠습니다. 두 가지 맞춤 페이지 매김 클래스를 사용하여 설정하면 작동합니다. pagination_class

이 작업을하려면 도움이 필요합니다.

답변

2

문제는 : self._paginator는 매기기 클래스 인스턴스, 그 자체가

그것은 AnonymousPaginator()RegisteredPaginator()하지 AnonymousPaginator, RegisteredPaginator해야하는 클래스를 필요로한다.

 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-depend-on-query -param/38989390 # 38989390 – levi

관련 문제