Django REST framework的分页

DRF分页组件

为什么要使用分页

我们数据表中可能会有成千上万条数据,当我们访问某张表的所有数据时,我们不太可能需要一次把所有的数据都展示出来,因为数据量很大,对服务端的内存压力比较大还有就是网络传输过程中耗时也会比较大。

通常我们会希望一部分一部分去请求数据,也就是我们常说的一页一页获取数据并展示出来。

DRF使用分页器

分页模式

rest framework中提供了三种分页模式:

from rest_framework.pagination import PageNumberPagination, LimitOffsetPagination, CursorPagination

全局配置

1REST_FRAMEWORK = { 2 'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.LimitOffsetPagination', 3 'PAGE_SIZE': 100 4}

局部配置

我们可以在视图类中进行局部设置

class PublisherViewSet(ModelViewSet):    queryset = models.Publisher.objects.all()    serializer_class = PublisherModelSerializer    pagination_class = PageNumberPagination  # 注意不是列表(只能有一个分页模式)

DRF内置分页器

PageNumberPagination

按页码数分页,第n页,每页显示m条数据

例如:http://127.0.0.1:8000/api/article/?page=2&size=1

分页器

1class MyPageNumber(PageNumberPagination): 2 page_size = 2 # 每页显示多少条 3 page_size_query_param = 'size' # URL中每页显示条数的参数 4 page_query_param = 'page' # URL中页码的参数 5 max_page_size = None # 最大页码数限制

视图

1class ArticleList(APIView): 2 def get(self, request, *args, **kwargs): 3 res = {"code": 0} 4 article_list = models.Article.objects.all().order_by("id") 5 # 分页 6 page_obj = MyPageNumber() 7 page_article = page_obj.paginate_queryset(queryset=article_list, request=request, view=self) 8 ser_obj = ArticleSerializer(page_article, many=True) 9 res["data"] = ser_obj.data 10 return Response(res)

返回带页码链接的响应

1class ArticleList(APIView): 2 def get(self, request, *args, **kwargs): 3 res = {"code": 0} 4 article_list = models.Article.objects.all().order_by("id") 5 # 分页 6 page_obj = MyPageNumber() 7 page_article = page_obj.paginate_queryset(queryset=article_list, request=request, view=self) 8 ser_obj = ArticleSerializer(page_article, many=True) 9 res["data"] = ser_obj.data 10 return page_obj.get_paginated_response(res)

LimitOffsetPagination 

分页,在n位置,向后查看m条数据

例如:http://127.0.0.1:8000/api/article/?offset=2&limit=2

分页器

1# offset分页 2class MyLimitOffset(LimitOffsetPagination): 3 default_limit = 1 4 limit_query_param = 'limit' 5 offset_query_param = 'offset' 6 max_limit = 999

视图

1class ArticleList(APIView): 2 def get(self, request, *args, **kwargs): 3 res = {"code": 0} 4 article_list = models.Article.objects.all().order_by("id") 5 # 分页 6 page_obj = MyLimitOffset() 7 page_article = page_obj.paginate_queryset(queryset=article_list, request=request, view=self) 8 ser_obj = ArticleSerializer(page_article, many=True) 9 res["data"] = ser_obj.data 10 return page_obj.get_paginated_response(res)

CursorPagination

加密分页,把上一页和下一页的id值记住

分页器

1# 加密分页 2class MyCursorPagination(CursorPagination): 3 cursor_query_param = 'cursor' 4 page_size = 1 5 ordering = '-id' # 重写要排序的字段

视图

1class ArticleList(APIView): 2 def get(self, request, *args, **kwargs): 3 res = {"code": 0} 4 article_list = models.Article.objects.all().order_by("id") 5 # 分页 6 page_obj = MyCursorPagination() 7 page_article = page_obj.paginate_queryset(queryset=article_list, request=request, view=self) 8 ser_obj = ArticleSerializer(page_article, many=True) 9 res["data"] = ser_obj.data 10 # return Response(res) 11 return page_obj.get_paginated_response(res)
点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

2020年前端实用代码段,为你的工作保驾护航

有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )

Django REST framework的分页 - HelloWorld