14 DRF-分页

在查看数据列表的API中,如果数据量比较大,肯定不能把所有的数据都展示给用户,而需要通过分页展示。

在drf中为我们提供了一些分页先关类:

BasePagination,基类
PageNumberPagination(BasePagination)	支持 /accounts/?page=4&page_size=100 格式的分页(page当前页,page_size每页显示的数)适用于显示页面,上一页,下一页
LimitOffsetPagination(BasePagination)	支持 ?offset=100&limit=10 格式的分页(在数据库中,从100条开始往后取10条数据)
	默认方式不常用,以下是自己构造的方式
	?lastid=10&offset=0&limit=10  格式分页(找到id大于10,从0开始的后10条数据) --常用于 滚动翻页

1 PageNumberPagination

初步使用:

直接使用 PageNumberPagination 类

image


自定义分页类:

from rest_framework.pagination import PageNumberPagination

class MyPageNumberPagination(PageNumberPagination):
    # page_size = 2  # 每页显示的数据(可在全局配置)
    page_query_param = "p"  # 配置page key值
    page_size_query_param = "px"  # 配置page_size key值
    max_page_size = 10  # 每页显示数据最大值10

构造序列化返回数据(共有多少数据,上一页,下一页,序列化数据):

image


2 LimitOffsetPagination

image

LimitOffsetPagination 同样也可以创建子类,配置相应的值,同PageNumberPagination一样,唯一不一样的就是url中的参数。

如果单纯的使用 LimitOffsetPagination 没有问题,但是会出现一些小bug,比如数据重复取。

那么如何解决呢?再参数中多加两个参数,记录当前访问的数据的最大id和最小id

image

注意:limitOffset的形式一般会结合上一次的商品ID,查询小于此ID的商品,实现 滚动下来分析。

应用:

  • 博客列表,使用LimitOffsetPagination
  • 评论列表,使用PageNumberPagination
posted @ 2022-10-24 16:02  角角边  Views(38)  Comments(0)    收藏  举报