![2b8206c96b350d0d91def0dc0b608192.png](https://img-blog.csdnimg.cn/img_convert/2b8206c96b350d0d91def0dc0b608192.png)
Ⅰ REST framework提供了分页的支持
我们可以在配置文件中设置全局的分页方式,如:
REST_FRAMEWORK = {
'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination',
'PAGE_SIZE': 100 # 每页数目
}
也可通过自定义Pagination类,来为视图添加不同分页行为。在视图中通过pagination_clas
属性来指明
class LargeResultsSetPagination(PageNumberPagination):
page_size = 1000
page_size_query_param = 'page_size'
max_page_size = 10000
class BookDetailView(RetrieveAPIView):
queryset = BookInfo.objects.all()
serializer_class = BookInfoSerializer
pagination_class = LargeResultsSetPagination
注意:如果在视图内关闭分页功能,只需在视图内设置
pagination_class = None
Ⅱ 可选分页器 -- PageNumberPagination:普通分页
前端访问网址形式:
GET http://127.0.0.1:8000/student/?page=4
可以在子类中定义的属性:
- page_size -- 每页数目
- page_query_param -- 前端发送的页数关键字名,默认为”page”
- page_size_query_param -- 前端发送的每页数目关键字名,默认为None
- max_page_size -- 前端最多能设置的每页数量
views.py视图函数
from rest_framework.pagination import PageNumberPagination
# 自定义分页器
class MyPageNumberPagination(PageNumberPagination):
page_size = 3 # 每页显示3条数据
page_query_param = 'page' # 查询参数
page_size_query_description = 'size'
max_page_size = 5 # 最大每页显示五条数据
# 查询函数
from app01.serializer import StudentSerializer
from app01.models import Student
from rest_framework.viewsets import GenericViewSet
from rest_framework.mixins import ListModelMixin
class StudentView(GenericViewSet, ListModelMixin): # 使用自动生成路由,必须继承ViewSetMixin
queryset = Student.objects.all()
serializer_class = StudentSerializer
pagination_class = MyPageNumberPagination # 配置自定义的分页器
serializer.py序列化器
from app01.models import Student
from rest_framework import serializers
class StudentSerializer(serializers.ModelSerializer):
sex = serializers.CharField(source='get_sex_display')
class Meta:
model = Student
fields = '__all__'
models.py表模型
from django.db import models
class Student(models.Model):
choice_sex = [(1, '男'), (2, '女'), (0, '保密')]
name = models.CharField(max_length=32)
sex = models.SmallIntegerField(choices=choice_sex,default=0)
age = models.IntegerField()
urls.py自动生成路由
from django.contrib import admin
from django.urls import path
from app01 import views
from rest_framework.routers import SimpleRouter
router = SimpleRouter() # 选择生成不带id的路由
router.register('student',views.StudentView)
urlpatterns = [
path('admin/', admin.site.urls),
]
urlpatterns += router.urls
![05dab049e47d5fc72b02c08ace14305a.png](https://img-blog.csdnimg.cn/img_convert/05dab049e47d5fc72b02c08ace14305a.png)
Ⅲ 可选分页器 -- LimitOffsetPagination:偏移分页
前端访问网址形式:
GET http://127.0.0.1/four/student/?limit=100&offset=400
- default_limit = api_settings.PAGE_SIZE # 默认条数
- limit_query_param = 'limit' # 查询时,查询参数及指定查询多少条
- offset_query_param = 'offset' # 查询时,指定的起始位置是哪
- max_limit = None # 查询时,最多返回多少条
views.py偏移分页器视图类
# 分页器视图 -- 偏移分页
from rest_framework.pagination import LimitOffsetPagination
class MyPageNumberPagination(LimitOffsetPagination):
default_limit = 5
limit_query_param = 'limit'
offset_query_param = 'offset'
max_limit = 5
![4d431f7fdfeafa1a24d6fb489d6d7b22.png](https://img-blog.csdnimg.cn/img_convert/4d431f7fdfeafa1a24d6fb489d6d7b22.png)
Ⅳ 可选分页器 -- CursorPagination:游标分页 -- 速度快,但不能指定查询
前端访问网址形式:
GET http://127.0.0.1/four/student/ # 首页,第一页
GET http://127.0.0.1/four/student/?cursor=cD03 # 点击上一页 or 上一页自动生成的
- cursor_query_param = 'cursor' # 查询的时候,指定的查询方式
- page_size = api_settings.PAGE_SIZE # 每页显示多少条
- ordering = '-created' # 排序方式
- page_size_query_param = None # 查询的时候指定每页显示多少条
- max_page_size = None # 每页最多显示多少条
views.py游标分页视图类
from rest_framework.pagination import CursorPagination
class MyPageNumberPagination(CursorPagination):
cursor_query_param = 'cursor' # 查询方式
page_size = 3 # 每页显示多少条
ordering = '-id' # 排序方式,按什么排序
page_size_query_description = None # 查询的时候指定每页显示多少条
max_page_size = None # 每页最多显示多少
![81a9f6f85b5f919295eba5d468c0bdd3.png](https://img-blog.csdnimg.cn/img_convert/81a9f6f85b5f919295eba5d468c0bdd3.png)
Ⅴ 继承APIView的分页方式
views.py分页器类
from rest_framework.pagination import PageNumberPagination
class MyPageNumberPagination(PageNumberPagination):
page_size = 3 # 每页显示3条数据
page_query_param = 'page' # 查询参数
page_size_query_description = 'size'
max_page_size = 5 # 最大每页显示五条数据
class StudentAPIView(APIView):
def get(self, request):
student_list = Student.objects.all()
page = MyPageNumberPagination() # 普通分页器实例化得到对象
res = page.paginate_queryset(student_list, request, self) # 分页后的数据,分页器指定几条,就有几条
ser = StudentSerializer(res, many=True)
# return Response(ser.data) # 返回当前分页的一页的数据
return page.get_paginated_response(ser.data) # 返回全部序列化数据
![f5b399f3bbed58659a57f257dcee1201.png](https://img-blog.csdnimg.cn/img_convert/f5b399f3bbed58659a57f257dcee1201.png)
后续变更分页器类即可使用三种不同分页器
page = MyPageNumberPagination() # 普通分页器偏移分页器游标分页器实例化得到对象