Django Rest Framework 全局分页和 pagination_class 不起作用

Sar*_*ara 3 python django django-pagination django-rest-framework

我的设置:

REST_FRAMEWORK = {
    'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination',
    'PAGE_SIZE': 2
}
Run Code Online (Sandbox Code Playgroud)

我的分页类:

REST_FRAMEWORK = {
    'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination',
    'PAGE_SIZE': 2
}
Run Code Online (Sandbox Code Playgroud)

我的测试视图类:

from rest_framework.pagination import PageNumberPagination


class CustomNumberPagination(PageNumberPagination):
    page_size = 5
Run Code Online (Sandbox Code Playgroud)

我可以在控制台中正确打印出 PageNumberPagination 和 CustomNumberPagination 的 page_size 。

但是,page作为参数传递没有任何效果。我无法在每个视图中使用全局分页或 pagination_class 来工作。我不知道出了什么问题,但似乎大多数人都做了同样的事情,只是为他们工作。如果对我有任何建议,我将不胜感激。

更新

刚刚从下面我选择的答案中得到了一些灵​​感。

由于我必须在覆盖中编写大量自定义内容get(),因此我刚刚更新了我的get()

from rest_framework.pagination import PageNumberPagination
from .pagination import CustomNumberPagination


class Testing(generics.GenericAPIView):

    queryset = Testing.objects.all()
    serializer_class = TestingSerializer
    pagination_class = CustomNumberPagination

    def get(self, request):
        queryset = self.get_queryset()
        page = self.request.query_params.get('page')
        if page is not None:
            paginate_queryset = self.paginate_queryset(queryset)
            serializer = self.serializer_class(paginate_queryset, many=True)
            return self.get_paginated_response(serializer.data)

        serializer = self.serializer_class(queryset, many=True)
        return Response(serializer.data)
Run Code Online (Sandbox Code Playgroud)

opa*_*ski 7

看看 drf 本身是如何完成的:

class ListModelMixin(object):
    """
    List a queryset.
    """
    def list(self, request, *args, **kwargs):
        queryset = self.filter_queryset(self.get_queryset())

        page = self.paginate_queryset(queryset)
        if page is not None:
            serializer = self.get_serializer(page, many=True)
            return self.get_paginated_response(serializer.data)

        serializer = self.get_serializer(queryset, many=True)
        return Response(serializer.data)
Run Code Online (Sandbox Code Playgroud)

希望这会对您有所帮助 - 这是不言自明的;

你使用了GenericAPIView-并且覆盖了get-你应该使用的get_paginated_response方法来实现分页。

快乐编码。