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

1 python django json django-rest-framework

我正在使用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"
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

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

{
  "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
}
Run Code Online (Sandbox Code Playgroud)

最重要的属性是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...,
        })
Run Code Online (Sandbox Code Playgroud)

Rob*_*ert 6

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

分页

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)
         ]))
Run Code Online (Sandbox Code Playgroud)

在您看来

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) 
Run Code Online (Sandbox Code Playgroud)

并且您需要在settings.py中进行配置

REST_FRAMEWORK = {
    'DEFAULT_PAGINATION_CLASS': 'my_project.apps.core.pagination.CustomPageNumber',
    'PAGE_SIZE': 100
}
Run Code Online (Sandbox Code Playgroud)

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


Bea*_*own 5

如果我理解你是正确的,你可以使用 self.page.number

    return Response({
        'links': {
            'next': self.get_next_link(),
            'previous': self.get_previous_link()
        },
        'count': self.page.paginator.count,
        'results': data,
        'page_number': self.page.number,
        #              ^^^^^^^^^^^^^^^^
    })
Run Code Online (Sandbox Code Playgroud)