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
本文来自博客园,作者:蕝戀,转载请注明原文链接:https://www.cnblogs.com/juelian/p/17561854.html