首页 > 其他 > 详细

django_restfreamwork 7 分页组件

时间:2020-08-22 18:35:28      阅读:58      评论:0      收藏:0      [点我收藏+]

DRF【分页组件】

DRF分页器和作用

作用:

对千万条数据查询,全部取出来,对内存要求很高,甚至有可能会暴内存,对机器内存压力非常大

如果数据一点点取,项目也分页展示,就可以对项目进行负载的优化

DRF框架提供了3种分页

from rest_framework.pagination import PageNumberPagination, LimitOffsetPagination, CursorPagination

3种分页的区别

PageNumberPagination : 使用page 和page_size做分页 ,拿第几页,每页显示多少个

LimitOffsetPagination:从第几个开始找,向后找多少条

CursorPagination:基于游标的分页,对url参数进行加密,并且可以对某些字段进行正序和倒序

PageNumberPagination分页组件

新建分页组件

新建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

技术分享图片

LimitOffsetPagination分页组件

新建分页组件

新建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 从第一条开始找

技术分享图片

CursorPagination 分页组件

新建分页组件

新建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)

django_restfreamwork 7 分页组件

原文:https://www.cnblogs.com/wyzerg/p/13546425.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!