2016-07-11 8 views
0

Dies ist meine question vor 2 Tagen zurück gefragt. Ich benutzte Louis Barranqueiros answer, um mein Problem zu lösen. Jetzt möchte ich aktuelle Seitennummer sowie page_size in den serialisierten Daten hinzufügen. Ich weiß, ich habe die get_paginated_response Methode in PageNumberPagination Klasse anpassen, aber wenn ich tun, dass ich diesen Fehler:AttributeError: '' Objekt hat kein Attribut 'Seite' DRF Paginierung

Mein Code

def get_paginated_response(self, data, request): 
     # import pdb 
     # pdb.set_trace() 
     return Response(OrderedDict([ 
      ('next', self.get_next_link()), 
      ('current', self.get_current_link()), 
      ('previous', self.get_previous_link()), 
      ('results', data) 
     ])) 

    def get_queryset(self, request): 
     product_sync_ts = self.request.GET.get('product_sync_ts', None) 
     if product_sync_ts: 
      product = Product.objects.filter(....) 
      ) 
      # return self.get_paginated_response(product, self.request) 
      return Response(product) 
     else: 
      content = {'details': "Bad Request"} 
      raise APIException400(request, content) 


    def get(self, request, format=None): 
     products = self.get_queryset(request) 
     serializer = SyncedProductSerializer(instance={'products': products}) 
     # product = self.paginate_queryset(serializer, request) 
     return self.get_paginated_response(serializer, request) 
     # return self.get_paginated_response(serializer.data, request) 

Fehler:

File "/Users/Documents/content-api/venv/lib/python2.7/site-packages/rest_framework/pagination.py", line 242, in get_next_link 
    if not self.page.has_next() 
AttributeError: 'PaginatedProductList' object has no attribute 'page' 

Antwort

0

So Schließlich habe ich herausgefunden, wie ich dieses Problem lösen kann.

Be niedrig ist, den Code (Simple und dumme Fehler, die ich tun wurde)

class PaginatedProductList(APIView, PageNumberPagination): 

    page_size = 1000 #---crucial line 
    max_page_size = 1000 

    def get_paginated_response(self, data, page, page_num): 
     return Response(OrderedDict([ 
      ('count', self.page.paginator.count), 
      ('current', page), 
      ('next', self.get_next_link()), 
      ('previous', self.get_previous_link()), 
      ('page_size', page_num), 
      ('results', data) 
     ])) 

    def get_queryset(self, request): 
     product_sync_ts = self.request.GET.get('product_sync_ts', None) 
     if product_sync_ts: 
      product = Product.objects.filter(...) 
      ) 
      return self.paginate_queryset(product, self.request) 

     raise APIException400(request, {'details': "Bad Request"}) 

    def get(self, request): 
     page = self.request.GET.get('page', 1) 
     page_size = self.request.GET.get('page_size', 1000) 
     products = self.get_queryset(request) 
     serializer = SyncedProductSerializer(instance={'products': products}) 
     return self.get_paginated_response(serializer.data, page, page_size) 
0

Irgend jemand könnte wanna versuchen:

REST_FRAMEWORK = { 
    'PAGE_SIZE': 20, 
    'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.LimitOffsetPagination',} 

auf settings.py

mit Blick wie

class GeneralManagementAPIView(generics.ListAPIView): 
    queryset = GeneralManagements.objects.all() 
    permission_classes = (IsAuthenticatedOrReadOnly,) 
    renderer_classes = (GeneralManagementJSONRenderer,) 
    serializer_class = GeneralManagementSerializer 

    def get_queryset(self): 
     return GeneralManagements.objects.all() 

    def list(self, request): 
     queryset = self.get_queryset() 
     page = self.paginate_queryset(queryset) 
     print("request ", request) 

     serializer_context = {'request': request} 
     serializer = self.serializer_class(
      page, context=serializer_context, many=True 
     ) 
     print("serializer ", serializer, "serializer.data", serializer.data) 
     return self.get_paginated_response(serializer.data) 
0

Anders als die Klasse PageNumberPagination erben, versuchen Sie, Ihre Paginierungsklasse außerhalb Ihrer v iew (als separate Klasse) erbt von PageNumberPagination. und erwähne diesen Klassennamen als pagination class = YourClassName. innerhalb Ihrer Ansicht

class PaginationClass(PageNumberPagination): 
    page_size = 2 

und im Blick,

class GeneralManagementAPIView(generics.ListAPIView): 
    pagination_class = PaginationClass