分页Pagination

分页Pagination

REST framework提供了分页的支持。

我们可以在配置文件中设置全局的分页方式,如:

REST_FRAMEWORK = {
    'DEFAULT_PAGINATION_CLASS':  'rest_framework.pagination.PageNumberPagination',
    'PAGE_SIZE': 100  # 每页数目
}

也可通过自定义Pagination类,来为视图添加不同分页行为。在视图中通过pagination_clas属性来指明。

from rest_framework.pagination import PageNumberPagination
class LargeResultsSetPagination(PageNumberPagination):
    page_size = 1000  #一页的条数
    #接口中选择页码的字段名,一般不做修改,默认第三页 -- 接口: ?page=1
    page_query_parm = 'page' 
    #用户可以通过接口自定义一页条数-- ?page=1&page_size=条数
    page_size_query_param = 'page_size'
    #用户可以自定义最大的条数,超过就采用最大值
    max_page_size = 10000
    
class BookDetailView(RetrieveAPIView):
    queryset = BookInfo.objects.all()
    serializer_class = BookInfoSerializer
    #分页
    pagination_class = LargeResultsSetPagination

注意:如果在视图内关闭分页功能,只需在视图内设置

pagination_class = None

 可选分页器

1) PageNumberPagination

前端访问网址形式:

GET  http://api.example.org/books/?page=4
可以在子类中定义的属性:

- page_size 每页数目
- page_query_param 前端发送的页数关键字名,默认为"page"
- page_size_query_param 前端发送的每页数目关键字名,默认为None
- max_page_size 前端最多能设置的每页数量
from rest_framework.pagination import PageNumberPagination

class StandardPageNumberPagination(PageNumberPagination):
    page_size_query_param = 'page_size'
    max_page_size = 10

class BookListView(ListAPIView):
    queryset = BookInfo.objects.all().order_by('id')
    serializer_class = BookInfoSerializer
    pagination_class = StandardPageNumberPagination

# 127.0.0.1/books/?page=1&page_size=2

 2)LimitOffsetPagination

前端访问网址形式:

GET http://api.example.org/books/?limit=100&offset=400
接口: ?offset=0&limit3  从第一条往后查3条

可以在子类中定义的属性:

  • default_limit 默认限制,默认值与PAGE_SIZE设置一直

  • limit_query_param limit参数名,默认'limit'

  • offset_query_param offset参数名,默认'offset'

  • max_limit 最大limit限制,默认None

#paginations.py
from rest_framework.pagination import LimitOffsetPagination
class LimitOffsetPagination(LimitOffsetPagination):
    default_limit = 1000  #一页的条数
    limit_query_parm = 'limit' 
    offset_query_param = 'offset'
    #用户可以自定义最大的条数,超过就采用最大值
    max_page_size = 10000
    
class BookListView(ListAPIView):
    queryset = BookInfo.objects.all().order_by('id')
    serializer_class = BookInfoSerializer
    pagination_class = paginations.LimitOffsetPagination    

# 127.0.0.1:8000/books/?offset=3&limit=2

 3) CoursorPagination

#上一页和下一页都是加密的
#paginations.py
from rest_framework.pagination import CoursorPagination
class CoursorPagination(pagination.CoursorPagination):
    page_size = 2  #一页的条数
    #请求页码数据的字段,字段后的参数是加密的
    cursor_query_parm = 'cursor' 
    #用户自定义一页条数的字段
    page_size_query_param = 'page_size'
    #用户可以自定义最大的条数,超过就采用最大值
    max_page_size = 4
    #默认数据查询的排序条件-不能与drf的ordering组件同时使用
    ordering = '-id'
    
 class BookListView(ListAPIView):
    queryset = BookInfo.objects.all().order_by('id')
    serializer_class = BookInfoSerializer
    pagination_class = paginations.CoursorPagination    

 

posted on 2019-08-24 22:57  Jolinhe  阅读(543)  评论(0编辑  收藏  举报