Django-DRF分页器

drf内置了三种分页器

PageNumberPagination:普通分页(用的最多)
LimitOffsetPagination:偏移分页(用的第二多)
CursorPagination:游标分页(在数据类很大情况下使用,因为使用游标,所以查询最快,但是只能查当前页的前后各一页)

三个基类的位置

from rest_framework.pagination import PageNumberPagination
from rest_framework.pagination import LimitOffsetPagination
from rest_framework.pagination import CursorPagination

分页模式有两种APIView和GenericAPIView+ListModelMixin,当视图继承APIView,需要自己重写get,post等方法,写法有所不同

GenericAPIView+ListModelMixin的分页模式:

1.PageNumberPagination

PageNumberPagination:普通分页(用的最多)
# 在默认中的类中,四个属性的默认设置
page_size = api_settings.PAGE_SIZE  # 每页显示多少条
page_query_param = 'page'           # 查询参数
page_size_query_param = size        # 查询的时候指定每页显示多少条
max_page_size = 10                # 每页最多显示多少条
# 使用方式:
-定义一个类,继承PageNumberPagination,重写四个属性
class MyPageNumberPagination(PageNumberPagination):
    page_size = 3
    page_query_param = 'page'
    page_size_query_param = 'size'
    max_page_size = 5
    
-在继承了GenericAPIView+ListModelMixin视图类中配置
    pagination_class = MyPageNumberPagination
-查询
    http://127.0.0.1:8000/students/?page=1&size=5

2.LimitOffsetPagination

LimitOffsetPagination:偏移分页
-default_limit = api_settings.PAGE_SIZE  # 默认条数
-limit_query_param = 'limit'             # 查询时,指定查询多少条
-offset_query_param = 'offset'           # 查询时,指定的起始位置是哪 
-max_limit = None                        # 查询时,最多返回多少条

# 使用方式:
-定义一个类,继承LimitOffsetPagination,重写四个属性
class MyLimitOffsetPagination(LimitOffsetPagination):
    default_limit = 2  # 默认条数
    limit_query_param = 'limit'  # 查询时,指定查询多少条
    offset_query_param = 'offset'  # 查询时,指定的起始位置是哪
    max_limit = 5  # 查询时,最多返回多少条
-在继承了GenericAPIView+ListModelMixin视图类中配置
pagination_class = MyPageNumberPagination
-查询
http://127.0.0.1:8000/students/?limit=100&offset=1

3.CursorPagination

CursorPagination:游标分页(速度块)
-cursor_query_param = 'cursor'  # 查询的时候,指定的查询方式
-page_size = api_settings.PAGE_SIZE # 每页显示多少条
-ordering = '-created'   # 排序方式
-page_size_query_param = size  # 查询的时候指定每页显示多少条
-max_page_size = None          #每页最多显示多少条

# 使用方式:
-定义一个类,CursorPagination,重写四个属性
class MyCursorPagination(CursorPagination):
    cursor_query_param = 'cursor'  # 查询的时候,指定的查询方式
    page_size = 2  # 每页显示多少条
    ordering = 'id'  # 排序方式,一定要指定排序方式,就是model中的可以排序的字段
	page_size_query_param=size
    max_page_size=10
    
-在继承了GenericAPIView+ListModelMixin视图类中配置
pagination_class = MyCursorPagination
-查询
http://127.0.0.1:8000/students/  # 啥都不加,因为只能上一页或者下一页,无法指定第几页

APIView的分页模式

-新建一个类,继承普通分页,重写四个属性

-视图类写法如下
class StudentApiView(APIView):
    def get(self,request):
        student_list=Student.objects.all()
        page=MyPageNumberPagination()# 实例化得到对象
        # 只需要换不同的分页类即可
        res=page.paginate_queryset(student_list,request,self)# 开始分页
        ser=StudentSerializer(res,many=True)
        return page.get_paginated_response(ser.data) # 返回数据
posted @ 2020-12-01 10:41  王寄鱼  阅读(179)  评论(0编辑  收藏  举报