Django Rest Framework,具有自定义分页的Rest API

时间:2015-03-31 17:30:36

标签: python django pagination django-rest-framework

我正在使用Django Rest Framework 我有以下情况:

我有一个包含一些元素的表格(例如10k元素) 我在这个模型中也有一个独特的索引:

....
Element i-1
Element i
Element i+1
Element i+2
....

我需要一个带有以下响应的REST API:

  

按中心索引GITS元素: i

我需要返回一组结果,其中包含之前的 N 元素以及 i 之后的 N 元素。

使用分页可以在这组结果中导航: 使用PREV我可以请求上一页并使用NEXT我可以请求下一页... 例如:

  

按中心索引= i

获取元素
PREV:....

Result:
[
Element k
Element k+1
......
Element i
......
Element w
Element w+1
]
NEXT:....

1 个答案:

答案 0 :(得分:2)

DRF documentation on pagination中声明可以编写自定义分页方法:

  

要创建自定义分页序列化程序类,您应该进行子类化   pagination.BasePagination并覆盖paginate_queryset(self, queryset, request, view=None)get_paginated_response(self, data)   方法:

     
      
  • paginate_queryset方法传递初始查询集和   应该返回一个只包含>请求页面中的数据的可迭代对象。
  •   
  • get_paginated_response方法传递了序列化页面数据   并应返回响应实例
  •   

所以我们会这样做:

基本范例

from rest_framework.pagination import BasePagination


class CenterPointPagination(BasePagination):
    default_center = 0
    default_radius = 5
    center_query_param = 'center'
    radius_query_param = 'radius'        

    def paginate_queryset(self, queryset, request, view=None):
        center = request.get(center_query_param, default_center)
        radius = request.get(radius_query_param, default_radius)

        start = center - radius if center - radius > 0 else 0
        finish = center + radius
        return list(queryset[start:finish])

    def get_paginated_resposne(self, data):
        return Response(OrderedDict([
            'center': center,
            'radius': radius,
            'results': data
        ]))

这几乎是你作为基础所需要的。
您必须进一步定制以满足您的需求 要了解如何做到这一点,请查看

的源代码