使用django rest框架根据用户类型更改分页

时间:2016-08-17 14:32:08

标签: python django pagination django-rest-framework

我尝试根据用户的状态设置我的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

错误讯息:

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

设置它们时,我的两个自定义分页类都正常工作

非常感谢任何有助于实现这一目标的帮助。

1 个答案:

答案 0 :(得分:2)

问题是:self._paginator需要一个paginator类实例,而不是一个类本身

应该是AnonymousPaginator()RegisteredPaginator(),而不是AnonymousPaginatorRegisteredPaginator

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