2017-10-08 5 views
0

Je construis une API en utilisant le framework de repos Django et Django et j'essaye d'ajouter le numéro de page sur les résultats de json. Et j'essaie d'ajouter le numéro de page dans les résultats retournés par exemple, je reçois actuellement ceci;Django Rest Framework ajouter un attribut de numéro de page en utilisant la classe 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" 
    } 
    ] 
} 

Mais j'essaie d'obtenir quelque chose comme ça;

{ 
    "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 
} 

L'attribut le plus important est le PAGE_NUMBER mais je ne suis pas sûr comment obtenir que de la classe parent à l'aide self... je ne vois aucun moyen direct en plus d'utiliser une fonction. Voici mon code;

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

Répondre

3

Vous pouvez utiliser votre pagination personnalisée dans viewset et changé sur la vue personnalisée

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) 
     ])) 

À votre avis

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) 

et vous devez configurer dans vos paramètres.py

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

Si vous voulez savoir plus se référer les docs custom-pagination-class

0

si je comprends que vous corriger vous pouvez utiliser 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, 
     #    ^^^^^^^^^^^^^^^^ 
    })