django DRF 组件 分页Pagination
因为django默认提供的分页器主要使用于前后端不分离的业务场景,所以REST framework也提供了针对接口数据的分页支持。
我们可以在配置文件settings.py中进行全局分页配置,代码:
"""drf的配置""" # from rest_framework.permissions import AllowAny, IsAuthenticated, IsAdminUser, IsAuthenticatedOrReadOnly REST_FRAMEWORK = { # 中间代码省略...... # 中间代码省略...... # 列表分页[全局配置,对整站所有的列表页视图都会进行分页处理] 'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination', # 以page参数作为分页参数 # 'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.LimitOffsetPagination', # 以limit和offset作为分页参数 'PAGE_SIZE': 2, # 每页数目,如果不设置,则没有进行分配 }
上面直接访问任意一个列表页视图的api接口,可以看到如下效果:
{ "count": 16, // 本次分页的总数据量 "next": "http://127.0.0.1:8000/component/page/?page=3", // 下一页数据所在的地址 "previous": "http://127.0.0.1:8000/component/page/", // 上一页数据所在的地址 "results": [ // 当前页数据的列表项 { "id": 6, "name": "xiaoming", "sex": true, "age": 20, "classmate": "303", "description": "hello world" }, // ..... ] }
路由
# --- coding: utf-8 -- # @Author: lichaoming # @Date : 2024/12/05 from django.urls import path, re_path from . import views urlpatterns = [ path("auth/",views.AuthenticationAPIView.as_view()), path("pess/",views.PermissionAPIView.as_view({"get":"list","post":"create"})), re_path("^pess/(?P<pk>\d+)/$", views.PermissionAPIView.as_view({"get": "retrieve", "put": "update", "delete": "destroy"})), path("throttle/", views.ThorttlingAPIView.as_view()), path("throttle2/", views.Thorttling2APIView.as_view()), path("list/", views.FilterAPIView.as_view()), path("order/", views.OrderAPIView.as_view()), path("stu/", views.StuListAPIView.as_view()), path("page/", views.PageAPIView.as_view()), ]
如果在settings.py配置文件中设置了全局分页,那么在drf中凡是调用了ListModelMixin的list()都会自动分页。如果项目中出现大量需要分页的数据,只有少数部分的不需要分页,则可以在少部分的视图类中关闭分页功能。可以在视图类中设置如下:
class PageAPIView(ListAPIView): queryset = Student.objects.all() serializer_class = StudentModelSerializer pagination_class = None # 关闭来自全局配置的分页设置,设置当前列表视图不需要分页
可选分页器
PageNumberPagination
前端访问网址形式:
GET http://127.0.0.1:8000/component/page/?page=2
可以在子类中定义的属性:
| 参数名 | 描述 |
|---|---|
| page_size | 每页数据量的数量,默认是没有设置的,我们可以在配置分页时通过PAGE_SIZE设置设置 |
| page_query_param | url地址栏上当前页码的参数名,默认为"page" |
| page_size_query_param | url地址栏上代表每一页数据量的参数名,默认是None,也就是不允许地址栏修改每一页数据量。 |
| max_page_size | 限制url地址栏上设置每一页数据量的最大值,前提是已经设置了page_size_query_param |
例如在当前子应用下的paginations.py创建一个自定义分页器类,代码:
from rest_framework.pagination import PageNumberPagination # PageNumberPagination,以页码作为分页条件 # page=1&page_size=10 第1页 # page=2&page_size=10 第2页 # ... class StudentPageNumberPagination(PageNumberPagination): page_size = 5 # 每一页默认实现的数据量 page_query_param = 'page' # 页码 page_size_query_param = 'page_size' # 每一页数据量的设置变量 max_page_size = 10 # 限制 page_size_query_param 的最大值
视图中使用自定义分页类,视图代码:
from .paginations import StudentPageNumberPagination class PageAPIView(ListAPIView): queryset = Student.objects.all() serializer_class = StudentModelSerializer # pagination_class = None # 关闭来自全局配置的分页设置,设置当前列表视图不需要分页 pagination_class = StudentPageNumberPagination
from rest_framework.pagination import PageNumberPagination,LimitOffsetPagination # LimitOffsetPagination,以数据库查询的limit和offset数值作为分页条件 # limit=10&offset=0 第1页 # limit=10&offset=10 第2页 # ...
LimitOffsetPagination
前端访问网址形式:
GET http://127.0.0.1:8000/component/page/?limit=5&offset=10
可以在子类中定义的属性:
| 参数 | 描述 |
|---|---|
| default_limit | 默认每一页展示数据的数量,默认值与PAGE_SIZE一样的 |
| limit_query_param | 默认'limit',default_limit的地址栏参数名 |
| offset_query_param | 查询数据的开始偏移量,相当于上面的page参数,默认'offset' |
| max_limit | 限制地址栏对每一页数据展示的最大数量。默认None |
子定义分页类,paginations.py,代码:
from rest_framework.pagination import PageNumberPagination,LimitOffsetPagination # 中间省略。。。 # LimitOffsetPagination,以数据库查询的limit和offset数值作为分页条件 # limit=10&offset=0 第1页 # limit=10&offset=10 第2页 # 中间省略。。。 class Student1LimitOffsetPagination(LimitOffsetPagination): default_limit = 5 # 每一页的数据量 offset_query_param = "offset" # 查询字符串中代表页码的变量名 limit_query_param = "limit" # 查询字符串中代表每一页数据的变量名 max_limit = 10 # 允许客户端通过查询字符串调整的最大单页数据量
视图,views.py,代码:
from .paginations import StudentPageNumberPagination, Student1LimitOffsetPagination class PageAPIView(ListAPIView): queryset = Student.objects.all() serializer_class = StudentModelSerializer # pagination_class = None # 关闭来自全局配置的分页设置,设置当前列表视图不需要分页 # pagination_class = StudentPageNumberPagination pagination_class = Student1LimitOffsetPagination # 访问地址:http://127.0.0.1:8000/component/page/
浙公网安备 33010602011771号