2017-10-08 18 views
0

我正在使用Django和Django rest框架构建API,并且试图在json结果上添加页码。我正在尝试在返回的结果中添加页码,例如,我正在获取这个;Django Rest Framework使用PageNumberPagination类添加页码属性

{ 
    "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..., 
     }) 

回答

3

您可以使用视图集中您的自定义分页,并改变了对自定义视图

pagination.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

0

如果我理解你正确,你可以使用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, 
     #    ^^^^^^^^^^^^^^^^ 
    }) 
相关问题