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  # 关闭来自全局配置的分页设置,设置当前列表视图不需要分页

也可通过自定义Pagination类来为视图添加不同分页行为。在视图类中通过pagination_classs属性来指明。

 

可选分页器

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/

 

 

 

 

 

 

posted @ 2025-06-24 15:07  minger_lcm  阅读(57)  评论(0)    收藏  举报