2016-07-25 124 views
4

由於版本3.3不再可能在視圖上定義page_size,因爲它已移至paginator類。 related deprecations在Django Rest框架中定義分頁page_size per-view

我們的API爲不同的視圖定義了不同的page_sizes,添加新的paginator子類只是爲了覆蓋page_size屬性而感到不明確。我無法在視圖定義中實例化paginator類,並使用__init__方法,因爲它的實例化爲here。我可以覆蓋這個,並使其成爲一個方法返回一個實例化了正確的參數,但因爲它的名字不是get_pagination_class,可能它不是一個好主意。

我的問題是什麼是最簡潔的方式來動態創建一個paginator類與正確的page_size屬性集?

我見過this的問題,我想避免它的兩個解決方案。

回答

4

可以實現的東西比較乾淨:


  • 假設你設定每類中的分頁與 pagination_class屬性。
  • 假設您在類中保留page_size屬性。

  1. 在你settings.py添加全局分頁設置:

    'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination', 
    'PAGE_SIZE': default_age_size, 
    

    你可以用這個所有具有相同的頁面大小的意見辦理。

  2. 對於其他任何視圖/視圖集:

    class ACustomViewSet(mixins.ListModelMixin, 
            mixins.DestroyModelMixin, 
            viewsets.GenericViewSet): 
    
        pagination_class = PageNumberPagination 
        page_size = N 
        pagination_class.page_size = self.page_size 
    

    或者你也可以做到這一點的方法中:

    def list(self, request, *args, **kwargs): 
        self.pagination_class.page_size = self.page_size 
        ... 
    
+0

你好約翰,我有一些麻煩,此代碼,基本上我有3天了學習蟒蛇,因爲我被分配來修復一個Python項目,但我仍然不太熟悉這門語言,所以我可以問你在'class ACustomViewSet'中應該在哪裏定義'N'和'self'?如果我有'mixins.CreateModelMixin'而不是'mixins.DestroyModelMixin'?會有什麼麻煩嗎?謝謝 – Frakcool

+0

嘿@Frakcool,1)'self'在python類中不需要明確的定義。 2)'N'可以是任何正整數,表示響應每頁有多少結果。3)'DestroyModelMixin'提供了一種刪除方法,'CreateModelMixin'提供了一種創建方法,所以不會有任何問題,只需使用其中的一種或兩種! 希望這會有所幫助:) –

+1

感謝John,從1)Python向我拋出一個'Undefined variable:self',從2和3我知道了,你認爲'self'的問題是什麼?我會繼續尋找它,等等!我想我只能說:'pagination_class.page_size = page_size'不是嗎? – Frakcool

1

我終於結束了在自定義分頁進行定製。它看起來是最整齊,最簡單的解決方案。

自定義分頁

from rest_framework import pagination 

class CustomPageNumberPagination(pagination.PageNumberPagination): 
    """Custom page number pagination.""" 

    page_size = 30 
    max_page_size = 10000 
    page_size_query_param = 'page_size' 

    def get_page_size(self, request): 
     """Get page size.""" 
     # On certain pages, force custom/max page size. 
     try: 
      view = request.parser_context['view'] 
      if view.action in [ 
       'custom_page_size_view_1', 
       'custom_page_size_view_2', 
       # ... 
       'custom_page_size_view_n', 
      ]: 
       return self.max_page_size 
     except: 
      pass 

     return super(CustomPageNumberPagination, self).get_page_size(request) 

視圖

from rest_framework.viewsets import ModelViewSet 
from rest_framework.decorators import list_route 
from .pagination import CustomPageNumberPagination 

class MyView(ModelViewSet): 

    pagination_class = CustomPageNumberPagination 

    @list_route() 
    def custom_page_size_view_1(self, request): 
     """Custom page size view 1""" 

    @list_route() 
    def custom_page_size_view_2(self, request): 
     """Custom page size view 2""" 

    @list_route() 
    def custom_page_size_view_3(self, request): 
     """Custom page size view 3"""