GeangViewSet上的Django Rest Framework分页

时间:2016-05-18 06:06:59

标签: python django pagination django-rest-framework

我有以下GenericViewSet,我正在尝试为视图集实现分页,这是我的视图集

class UserAccountViewSet(viewsets.GenericViewSet,
                      mixins.CreateModelMixin,
                      mixins.UpdateModelMixin,
                      mixins.DestroyModelMixin):
    queryset = UserAccount.objects.all()
    lookup_field = 'username'
    lookup_url_kwarg = "username"
    serializer_class = UserAccountSerializer
    page_size = 25
    page_size_query_param = 'page_size'
    max_page_size = 1000

    def list(self, request):
        queryset = self.queryset
        if request.GET.dict():
            return Response(status=status.HTTP_501_NOT_IMPLEMENTED)

        serializer = UserListSerializer(queryset, many=True)
        return Response(serializer.data)

    def retrieve(self, request, **kwargs):
        pass

    def create(self, request, *args, **kwargs):
        pass

    def update(self, request, *args, **kwargs):
        pass

    def destroy(self, request, *args, **kwargs):
        pass

这是我的配置,

REST_FRAMEWORK = {
    'DEFAULT_RENDERER_CLASSES': (
        'rest_framework.renderers.JSONRenderer',
    ),
    'DEFAULT_THROTTLE_CLASSES': (
        'rest_framework.throttling.AnonRateThrottle',
        'rest_framework.throttling.UserRateThrottle'
    ),
    'DEFAULT_THROTTLE_RATES': {
        'anon': '100/day',
        'user': '100/day'
    }
}

它没有被分页,我如何使用DRF进行分页?

谢谢。

1 个答案:

答案 0 :(得分:1)

由于您要覆盖list()方法并且未返回分页响应,因此您的API中没有获得分页响应。相反,您应该在super()方法中调用list(),因为DRF的list()方法本身会返回通用视图或视图集的分页响应。

  

如果您使用的是通用,则会自动执行分页   观点或视图集。如果您使用常规APIView,则需要执行此操作   自己调用分页API 以确保返回分页   响应。

class UserAccountViewSet(viewsets.GenericViewSet,
                      mixins.CreateModelMixin,
                      mixins.UpdateModelMixin,
                      mixins.DestroyModelMixin):

    def list(self, request, *args, **kwargs):
        if request.GET.dict():
            return Response(status=status.HTTP_501_NOT_IMPLEMENTED)

        # call 'super()' to get the paginated response
        return super(UserAccountViewSet, self).list(request, *args, **kwargs)