2017-08-14 76 views
2

序章:如何在非通用視圖/視圖集中使用分頁?

我已經看到了這個問題的不止一個帖子引起的:

,也應用在這裏:

我已經由一個例如在SO文檔統一我的答案,在上面的問題,但由於該文件將得到2017年8月8日關機,我將按照this widely upvoted and discussed meta answer的建議,並改變我例如一個自我回復的帖子。

當然,我很樂意看到任何不同的方法!


問:

我想用一個非通用視圖/視圖集中:在Django的REST框架項目(如APIView)。
當我讀了pagination documentation:如果你使用的是通用的看法或viewsets

分頁只自動執行。如果您使用的是常規的APIView,則需要自行調用分頁API以確保您返回分頁響應。舉例來說,請參閱mixins.ListModelMixingenerics.GenericAPIView類的源代碼。

,我還可以繼續使用非通用視圖/視圖集中?
如何在其上實現分頁?

回答

4

我們可以發現,而不需要一個解決方案來重新發明輪子:

  1. 讓我們對generics分頁是如何實現一看: django-rest-framework/rest_framework/generics.py
    這正是我們將使用我們的觀點以及!

  2. 讓我們假設我們有一個全球性的分頁設置如以下:
    settings.py

    REST_FRAMEWORK = { 
        'DEFAULT_PAGINATION_CLASS': 
         'rest_framework.pagination.DESIRED_PAGINATION_STYLE', 
        'PAGE_SIZE': 100 
    } 
    
  3. 爲了不臃腫我們的觀點/視圖集中的代碼,我們可以創建自定義混入存儲我們的分頁代碼:

    class MyPaginationMixin(object): 
    
        @property 
        def paginator(self): 
         """ 
         The paginator instance associated with the view, or `None`. 
         """ 
         if not hasattr(self, '_paginator'): 
          if self.pagination_class is None: 
           self._paginator = None 
          else: 
           self._paginator = self.pagination_class() 
         return self._paginator 
    
        def paginate_queryset(self, queryset): 
         """ 
         Return a single page of results, or `None` if pagination 
         is disabled. 
         """ 
         if self.paginator is None: 
          return None 
         return self.paginator.paginate_queryset(
          queryset, self.request, view=self) 
    
        def get_paginated_response(self, data): 
         """ 
         Return a paginated style `Response` object for the given 
         output data. 
         """ 
         assert self.paginator is not None 
         return self.paginator.get_paginated_response(data) 
    
  4. 然後在views.py

    from rest_framework.settings import api_settings 
    from rest_framework.views import APIView 
    
    from my_app.mixins import MyPaginationMixin 
    
    class MyView(APIView, MyPaginationMixin): 
        queryset = OurModel.objects.all() 
        serializer_class = OurModelSerializer 
        pagination_class = api_settings.DEFAULT_PAGINATION_CLASS 
    
        # We need to override the get method to insert pagination 
        def get(self, request): 
         ... 
         page = self.paginate_queryset(self.queryset) 
         if page is not None: 
          serializer = self.serializer_class(page, many=True) 
          return self.get_paginated_response(serializer.data) 
    

現在我們有一個APIView與分頁。

+0

'NoneType'對象沒有屬性'paginate_queryset'。即時通訊得到這個錯誤 – Thameem

+0

@Thameem沒有一些代碼來幫助你看看你做了什麼有點困難......如果問題依然存在,考慮在這裏提出一個問題。 –

+0

@感謝您的消息,我錯過了這個響應返回self.get_paginated_response(serializer.data)。謝謝。它的工作現在 – Thameem