【问题标题】:Django Rest Framework global pagination and pagination_class are not workingDjango Rest Framework 全局分页和 pagination_class 不起作用
【发布时间】:2017-02-17 20:50:40
【问题描述】:

我的设置:

REST_FRAMEWORK = {
    'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination',
    'PAGE_SIZE': 2
}

我的分页类:

from rest_framework.pagination import PageNumberPagination


class CustomNumberPagination(PageNumberPagination):
    page_size = 5

我的测试视图类:

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):
        print PageNumberPagination.page_size  # 2
        print self.pagination_class.page_size  # 5
        queryset = self.get_queryset()
        serializer = self.serializer_class(queryset, many=True)
        return Response(serializer.data, status=status.HTTP_200_OK)

我可以在控制台中正确打印出 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)

【问题讨论】:

  • 注意 self.request.query_params.get('page') - 如果没有指定页面,您的端点将返回查询集中的所有对象 :) 通常在这种情况下最好先返回页。所以 ...get('page', 1)
  • 感谢您的友好提醒:D 我将不得不将page 设为可选,因为我们的 FE 现在不支持分页。

标签: python django django-rest-framework django-pagination


【解决方案1】:

看看它是如何在 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)

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

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

编码愉快。

【讨论】:

  • 这很鼓舞人心,我刚刚解决了我的问题!非常感谢!
猜你喜欢
  • 1970-01-01
  • 2017-08-05
  • 2015-06-28
  • 2021-12-07
  • 2023-03-15
  • 2019-09-15
  • 2013-07-31
  • 2018-01-09
  • 2013-12-25
相关资源
最近更新 更多