作用:
对千万条数据查询,全部取出来,对内存要求很高,甚至有可能会暴内存,对机器内存压力非常大
如果数据一点点取,项目也分页展示,就可以对项目进行负载的优化
from rest_framework.pagination import PageNumberPagination, LimitOffsetPagination, CursorPagination
PageNumberPagination
: 使用page 和page_size做分页 ,拿第几页,每页显示多少个
LimitOffsetPagination
:从第几个开始找,向后找多少条
CursorPagination
:基于游标的分页,对url参数进行加密,并且可以对某些字段进行正序和倒序
新建pagination.py 或者 utils/pagination.py 也可以
from rest_framework.pagination import PageNumberPagination
class MyPagination(PageNumberPagination):
"""
http://xxx.xx.xx/?page=4
或者
http://xxx.xx.xx/?page=4&page_size=100
"""
page_size = 2 #每页几条数据
page_query_param = "page"
page_size_query_param = "size"
max_page_size = 3
from .models import Book
from rest_framework.views import APIView
from rest_framework.response import Response
from .serializers import BookSerializer
from .pagination import MyPagination #导入分页器
class BookView(APIView):
def get(self, request):
""" """
book_list = Book.objects.all()
# 1,实例化分页对象
page_obj = MyPagination()
# 2,调用分页方法去分页queryset
page_queryset = page_obj.paginate_queryset(queryset=book_list,request=request,view=self)
""" 参数1传queryset,参数2传request,参数3传self也可以等于None """
# 3,把分页好的数据 传给序列化器 返回
ser_obj = BookSerializer(page_queryset, many=True)
# 4,带着上一页下一页链接 响应
return page_obj.get_paginated_response(ser_obj.data)
from django.urls import path, include
from .views import BookView
urlpatterns = [
path(‘list‘, BookView.as_view()),
]
默认 访问 是 0.0.0.0:8000/books/list
指定size访问: 0.0.0.0:8000/books/list?page=2&size=2
第2页,展示2条数据
如果url不指定 size ,那么就会从分页器组件中去找 page_size的值 默认配置的2
新建pagination.py 或者 utils/pagination.py 也可以
from rest_framework.pagination import LimitOffsetPagination
class MyPagination(LimitOffsetPagination):
default_limit = 1 #默认向后找几条数据
limit_query_param = "limit" #自定义名
offset_query_param = "offset"
max_limit = 3 #最大限制
和 PageNumberPagination 组件使用的调用一模一样,无需改动代码
0.0.0.0:8000/books/list?limit=2&offset=1
limit=2 :向后找2条 offset=1 从第一条开始找
新建pagination.py 或者 utils/pagination.py 也可以
from rest_framework.pagination import CursorPagination
class MyPagination(CursorPagination):
cursor_query_param = "cursor"
page_size = 2 #每页显示几条
ordering = "-id" #根据xx进行排序 -为倒序:从大到小
和 PageNumberPagination 组件使用的调用一模一样,无需改动代码
默认访问 0.0.0.0:8000/books/list 接口
根据id从大到小返回数据 , 并且上一页参数和下一页参数进行加密
之前是视图继承了 APIView
,所以对get请求进行了改动
如果视图类继承了 GenericAPIView
和 ListModelMixin
只需要在 pagination_class = MyPagination 导入分页组件,就能自动根据分页配置进行展示
from .models import Book
from .serializers import BookSerializer
from rest_framework.generics import GenericAPIView
from rest_framework.mixins import ListModelMixin
class BookView(GenericAPIView,ListModelMixin):
queryset = Book.objects.all()
serializer_class = BookSerializer
pagination_class = MyPagination #直接引用分页组件,下面的get方法展示数据自动根据分页展示
def get(self, request):
return self.list(request)
原文:https://www.cnblogs.com/wyzerg/p/13546425.html