DRF光标分页示例

时间:2017-09-20 14:55:46

标签: pagination django-rest-framework

我尝试使用DRF设置CursorPagination以获取交易记录列表(按创建日期排序)。 我无法弄清楚如何做一个初始请求,因为我还没知道那个阶段的光标。令人惊讶的是,我无法找到这样的例子。

此外,有没有办法使用CursorPagination设置每个请求的页面大小,PageNumberPagination有 page_size_query_param max_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

如果我获取(next_url),我会得到下一条记录,这次我不必通过 data = {' page_size&#39 ;:2}

如果我能以更清洁,更一致的方式完成所有这些工作,请告诉我。

1 个答案:

答案 0 :(得分:5)

这就是我如何使用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