1.根据页码和每一页多少条数据做分页,实际配置即可
代码语言:javascript
复制from rest_framework import pagination
# 根据页码和每一页多少条数据做分页
class MyPagination(pagination.PageNumberPagination):
"""
http://127.0.0.1:8000/api/page?page=2&size=3
从第2页开始显示,每一页显示3条数据
"""
# 一页显示两条数据
page_size = 2
# url 拼接查询关键字,page=n,从第n页开始
page_query_param = 'page'
# url 拼接查询关键字,size=m,每页显示m条数据,不超过 max_page_size
page_size_query_param = 'size'
# 每一页给你限定死最多三条数据,即使请求每一超过3条也只显示3条
max_page_size = 3
1.1进入到PageNumberPagination里面查看可配置其他
2.根据第n条数据和每页数据量做分页,实际配置即可
代码语言:javascript
复制# 根据第n条数据和每页数据量做分页
class LimitOffsetPaginator(pagination.LimitOffsetPagination):
"""
http://127.0.0.1:8000/api/page?offset=2&limit=4
从第3条数据开始显示,每一页显示4条数据
"""
# 每一页默认显示 1 条数据
default_limit = 1
# url 拼接查询关键字,limit=n,每一页显示多少条
limit_query_param = 'limit'
# url 拼接查询关键字,offset=m,从第m 1条数据开始显示
offset_query_param = 'offset'
2.1进入到LimitOffsetPagination里面查看可配置其他
3.根据游标分页,只有上一页和下一页
代码语言:javascript
复制# 根据游标分页,只有上一页和下一页
class CursorPaginator(pagination.CursorPagination):
cursor_query_param = 'cursor'
# 根据 id 做游标
ordering = 'id'
# 每一页显示 2 条数据
page_size = 2
3.1进入到CursorPagination里面查看可配置其他
4.在视图中使用分页器,先要导入自己写的分页器
代码语言:javascript
复制class PageBookView(APIView):
def get(self, request):
queryset = Book.objects.all()
# 实例化这个分页类
page_obj = pagination.MyPagination()
# page_obj = pagination.LimitOffsetPaginator()
# page_obj = pagination.CursorPaginator()
# 每一页的 queryset,模型
page_queryset = page_obj.paginate_queryset(queryset, request)
# 每一页的分页模型序列化好数据
ser_obj = BookSerializer(page_queryset, many=True)
# 该方法封装了一些上一页下一页的链接
return page_obj.get_paginated_response(ser_obj.data)
5.在三层封装视图里面也可以直接使用和配置
代码语言:javascript
复制# 对全局APIView进行第三次封装
class BookModelView(viewsets.ModelViewSet):
# 同样配置 queryset 和 serializer_class
queryset = Book.objects.all()
serializer_class = BookSerializer
pagination_class = pagination.MyPagination
# pagination_class = pagination.LimitOffsetPaginator
# pagination_class = pagination.CursorPaginator
5.1注意直接使用的是 DRF 直接提供继承的 viewsets.ModelViewSet,不是 day93自己写的
5.2进入viewsets.ModelViewSet可以看到其实它已经帮助我们直接继承了所有的类。我们做的都是配置工作