DRF分页器

https://www.django-rest-framework.org/api-guide/pagination/

DRF给我们提供了几个分页器类,比较常用的2个是:

  • LimitOffsetPagination,基于offset 、limit参数来控制分页。
  • PageNumberPagination,基于page参数来控制分页。

只有当你使用GenericView或视图集ViewSet时才会自动进行分页。

设置分页类

全局设置

REST_FRAMEWORK = {
    # 注意:PAGE_SIZE 和 PAGINATION_CLASS 要一起设置,PAGE_SIZE=None也没有用...
    'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.LimitOffsetPagination',  # 默认为None
    'PAGE_SIZE': 100  # 默认为None,这个参数只要为None,分页器就不会启用。
}

视图类局部设置

在视图类或者视图集中使用pagination_class属性可以覆盖全局设置的分页器类。

class UserModelViewSet(ModelViewSet):
    pagination_class = LimitOffsetPagination
    ...

LimitOffsetPagination使用

这个分页类的URL要求:

# 使用GET请求查询字符串参数limit、offset来进行分页。这两个查询字符串名可以改,需要自己继承LimitOffsetPagination修改。

GET https://api.example.org/accounts/?limit=100&offset=400

点开LimitOffsetPagination类可以看到下面的这些代码

"""
A limit/offset based style. For example: 

http://api.example.org/accounts/?limit=100
http://api.example.org/accounts/?offset=400&limit=100
"""
default_limit = api_settings.PAGE_SIZE  # 默认的limit值,可以看到是从settings.py中读取PAGE_SIZE选项的
limit_query_param = 'limit'             # 设置limit在请求url路由中的参数名
offset_query_param = 'offset'           # 设置offset在请求url路由中的参数名
max_limit = None                        **# 允许用户一次请求最大的limit值,我们需要继承这个类并重写这个属性。**
                                        # 不然别人给你来个1000000,你就查数据库就卡得一逼...
                                        
template = 'rest_framework/pagination/numbers.html'  # 这个是在DRF浏览API文档时使用的分页渲染的模板。一般用不着改。

自定义LimitOffsetPagination类

class MyLimitOffsetPagination(LimitOffsetPagination):
    # 限制用户最大的请求数量,一般可以从settings.py中读取,这里就暂时写死了
    max_limit = 5
    default_limit = 2

PageNumberPagination的使用

请求URL

GET https://api.example.org/accounts/?page=4

page参数是用来控制第几页。

PageNumberPagination默认是不允许客户端自己设置page_size的。除非你自己继承PageNumberPagination并重写相关类属性。

自定义PageNumberPagination

class MyPageNumberPagination(PageNumberPagination):
    # PageNumberPagination和LimitOffsetPagination都需要在settings.py设置PAGE_SIZE
    # 如果全局配置中没有设置,那么等同于分页功能关闭。
    # 但是,我们可以重写。
    # page_size = api_settings.PAGE_SIZE
    page_size = 4
    
    # 自定义请求分页的page的请求参数名
    page_query_param = "pg"
    # 那么就变成了:http://127.0.0.1:8000/people/?pg=2

    # 开启使用请求参数来控制page_size
    # http://127.0.0.1:8000/people/?pg=2&pg_size=10
    page_size_query_param = "pg_size"

    # 限制客户端可以请求的最大page_size,如果客户端请求大于这个值,则按照这个值来请求分页数据
    # 必须page_size_query_param为非None才有作用!
    max_page_size = 10
posted @ 2023-07-18 09:07  蕝戀  阅读(29)  评论(0编辑  收藏  举报