2017-09-20 97 views
0

我試圖用DRF爲交易記錄列表(按創建日期排序)設置CursorPagination。 我無法弄清楚如何做一個初始請求,因爲在那個階段我還不知道遊標。令人驚訝的是,我找不到這樣的例子。DRF光標分頁示例

此外,有沒有一種方法來設置每個與CursorPagination請求的頁面大小,PageNumberPagination有page_size_query_paramMAX_PAGE_SIZE,他們是不是有CursorPagination。

這是我到目前爲止有:

class RecordPagination(pagination.CursorPagination): 
    page_size = 10 

class RecordsOverview(generics.ListAPIView): 
    serializer_class = RecordSerializer 
    logging_methods = ['GET'] 

    queryset = Record.objects.all() 
    pagination_class = RecordPagination 

    # Note: this is my way to dynamically set the page size, 
    # it is totally hacky, so I'm open to suggestions 
    # is_number method is left out for brevity 
    def get(self, request, *args, **kwargs): 
     page_size = request.GET.get('page_size', '') 

     if self.is_number(page_size) and int(page_size) > 0: 
      self.paginator.page_size = int(page_size) 

     return self.list(request, *args, **kwargs) 

然後在我的測試,我做一個GET請求:

response = self.client.get(GET_RECORDS_URL, data={'page_size': 2}) 

我回來了「下一個」鏈接看起來是這樣的:

http://testserver/api/v1/records/?cursor=cj0xJnA9MjAxNy0wOS0yMCsxNCUzQTM0JTNBNDkuNjUxMDU4JTJCMDAlM0EwMA%3D%3D&page_size=2 

如果我做GET(next_url)我會得到下一個記錄OK ,這次我不必通過data = {'page_size':2}

請讓我知道,如果我能以更清潔和更一致的方式做到這一切。

回答

1

這是我如何使用CursorPagination無任何併發症:

from rest_framework.pagination import CursorPagination 

class CursorSetPagination(CursorPagination): 
    page_size = 5 
    page_size_query_param = 'page_size' 
    ordering = '-timestamp' # '-creation' is default 

class MyListAPIView(generics.ListAPIView): 
    queryset = MyObject.objects.all() 
    serializer_class = MySerializer 
    pagination_class = CursorSetPagination