三种分页方式、 继承APIView实现分页
三种分页方式#
什么样接口要分页---->获取所有
三种分页方式--->继承GenericAPIView,ListModelMixin
-list方法--->
分页的使用#
from rest_framework.pagination 下的
PageNumberPagination
LimitOffsetPagination
CursorPagination
基本分页:正常的查第几页,每页显示多少条的方式--->常用
class CommonPageNumberPagination(PageNumberPagination):
#4 个类属性
page_size = 2 #每页显示条数
page_query_param = 'page' # 查询页码参数 ?page=10
page_size_query_param = 'size' # ?page=3&size=5000
max_page_size = 5 #可以通过size控制每页显示的条数,但是通过这个参数控制最多显示多少条
# http://127.0.0.1:8000/books/?page=1&size=300000
偏移分页
class CommonLimitOffsetPagination(LimitOffsetPagination):
default_limit = 2 # 每页显示多少条
limit_query_param = 'limit' # 取多少条
offset_query_param = 'offset' #从第0个位置偏移多少开始取数据
max_limit = 5 # 最大限制条数
# offset=6&limit=90000
# http://127.0.0.1:8000/books/?limit=3&offset=3 # 从第三条开始取3条
# limit_query_description = _('Number of results to return per page.')
游标分页
针对于大数据量分页效率高
可控性差
只能选择上一页和下一页,不能直接跳转到某一个
class CommonCursorPagination(CursorPagination):
cursor_query_param = 'cursor' # 查询的名字 等同于 page=xx
page_size = 3 # 每页显示多少条
ordering = 'id' # 排序规则,必须是表中有的字段,一般用id
#http://127.0.0.1:8000/books/?cursor=cD0z
views.py
from rest_framework.generics import GenericAPIView
from rest_framework.viewsets import GenericViewSet
from rest_framework.mixins import ListModelMixin
from .models import Book
from .serializer import BookSerializer
# 三种分页方式:
from .page import CommonPageNumberPagination as PageNumberPagination
from .page import CommonLimitOffsetPagination
from .page import CommonCursorPagination
class BookView(GenericAPIView,ListModelMixin):
class BookView(GenericViewSet, ListModelMixin):
queryset = Book.objects.all()
serializer_class = BookSerializer
# 只需要继承自己想要使用的分页方式就可以了,就是上面自己写的分页类
pagination_class= CommonCursorPagination
继承APIView实现分页#
# APIView实现分页
from rest_framework.views import APIView
from rest_framework.viewsets import ViewSet
from rest_framework.response import Response
class BookView(ViewSet):
def list(self,request):
books=Book.objects.all()
# 分页
# paginator=PageNumberPagination()
paginator=CommonLimitOffsetPagination()
#分页过后的数据
qs=paginator.paginate_queryset(books,request,self)
#序列化
ser=BookSerializer(qs,many=True)
# 第一种方式:每页总条数,上一页,下一页
# return Response(ser.data)
# 第二种:自己凑
# return Response({
# 'count':books.count(),
# 'next': paginator.get_next_link(),
# 'previous':paginator.get_previous_link(),
# 'results': ser.data
# })
# 第三种;直接使用分页类的方法
return paginator.get_paginated_response(ser.data)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用