Skip to main content
 首页 » 编程设计

python之Django Rest Framework 使用 PageNumberPagination 类添加页码属性

2025年05月04日20mq0036

我正在使用 Django 和 Django rest 框架构建 API,我正在尝试在 json 结果中添加页码。我正在尝试在返回的结果中添加页码,例如,我目前正在获取此信息;

{ 
  "links": { 
    "next": null, 
    "previous": null 
  }, 
  "count": 1, 
  "results": [ 
    { 
      "url": "http://127.0.0.1:8000/api/brands/1/?format=json", 
      "name": "microsoft", 
      "description": "Nothing", 
      "top_brand": true, 
      "guid": "microsoft" 
    } 
  ] 
} 

但我正试图得到这样的东西;

{ 
  "count": 1, 
  "results": [ 
    { 
      "url": "http://127.0.0.1:8000/api/brands/1/?format=json", 
      "name": "microsoft", 
      "description": "Nothing", 
      "top_brand": true, 
      "guid": "microsoft" 
    }, 
    ... 
  ], 
  "page_number": 1, 
  "from": 1, 
  "to": 10, 
  "last_page": 4 
} 

最重要的属性是 page_number,但我不太确定如何使用 self... 从父类中获取它,除了使用函数外,我看不到任何直接的方法。这是我的代码;

class StandardResultsSetPagination(PageNumberPagination): 
    page_size = 100 
    page_size_query_param = 'page_size' 
    max_page_size = 1000 
 
    def get_paginated_response(self, data): 
        return Response({ 
            'links': { 
                'next': self.get_next_link(), 
                'previous': self.get_previous_link() 
            }, 
            'count': self.page.paginator.count, 
            'results': data, 
            'page_number': self.page.paginator..., 
        }) 

请您参考如下方法:

您可以在 View 集中使用自定义分页并在自定义 View 上更改

分页.py

class CustomPageNumber(pagination.PageNumberPagination): 
    page_size = 2 
 
    def get_paginated_response(self, data): 
        return Response(OrderedDict([ 
             ('lastPage', self.page.paginator.count), 
             ('countItemsOnPage', self.page_size), 
             ('current', self.page.number), 
             ('next', self.get_next_link()), 
             ('previous', self.get_previous_link()), 
             ('results', data) 
         ])) 

在你看来

class TestViewSet(viewsets.ReadOnlyModelViewSet): 
    queryset = Test.objects.all().order_by('-created_at') 
    serializer_class = TestSerializer 
 
    @list_route(methods=['get'], url_path='get-records/(?P<pk>[^/]+)') 
    def get_record(self, request, pk): 
        self.pagination_class = CustomPageNumber 
        queryset = self.filter_queryset(self.queryset.filter(course=pk)) 
        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)  

你需要在你的settings.py中配置

REST_FRAMEWORK = { 
    'DEFAULT_PAGINATION_CLASS': 'my_project.apps.core.pagination.CustomPageNumber', 
    'PAGE_SIZE': 100 
} 

如果您想了解更多信息,请参阅文档 custom-pagination-class