分页器

Posted zhangguosheng1121

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了分页器相关的知识,希望对你有一定的参考价值。

一、常规分页:查看第n页,每页显示n条

url.py

url(r^publish/, views.Publish.as_view())

views.py

from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework.pagination import PageNumberPagination
from app01 import models
from rest_framework.serializers import ModelSerializer


class PublishSerializers(ModelSerializer):
    class Meta:
        model = models.Publish
        fields = __all__


class Publish(APIView):
    def get(self, request, *args, **kwargs):
        # 批量添加数据
        #  ll = []
        #  for i in range(100):
        #      ll.append(models.Publish(name=‘%s出版社‘ % i, city=‘%s城市‘ % i))
        #
        #  models.Publish.objects.bulk_create(ll)
        #  return Response()

        # 查询出所有数据
        ret = models.Publish.objects.all()
        # 实例化产生一个普通分页对象
        page = PageNumberPagination()
        # 每页显示多少条,也可以在settings里设置
        page.page_size = 4
        # 查询指定查询哪一页的key值
        page.page_query_param = page

        # 前端控制每页显示多少条的查询key值比如size=9,表示一页显示9条
        page.page_size_query_param = size
        # 控制每页最大显示多少,size如果传100,最多也是显示10
        page.max_page_size = 10
        ret_page = page.paginate_queryset(ret, request, self)
        # 序列化
        pub_ser = PublishSerializers(ret_page, many=True)
        # 去setting中配置每页显示多少条

        return Response(pub_ser.data)

settings.py

REST_FRAMEWORK = 
    PAGE_SIZE: 3  # 表示每页显示三条

前端展示:

技术图片

 

 

二、偏移分页:在第n个位置,向后查看n条数据

urls.py

url(r^publish/, views.Publish.as_view())

 views.py

from rest_framework.views import APIView
from app01 import models
from rest_framework.pagination import LimitOffsetPagination
from rest_framework.serializers import ModelSerializer


class PublishSerializers(ModelSerializer):
    class Meta:
        model = models.Publish
        fields = __all__


class Publish(APIView):
     def get(self, request, *args, **kwargs):
        # 批量添加
        #  ll = []
        #  for i in range(100):
        #      ll.append(models.Publish(name=‘%s出版社‘ % i, city=‘%s城市‘ % i))
        #
        #  models.Publish.objects.bulk_create(ll)
        #  return Response()
   

        ret = models.Publish.objects.all()
        # 实例化产生一个偏移分页对象
        page = LimitOffsetPagination()
        # 四个参数:
        # 从标杆位置往后取几个,默认取3个,我可以指定,# 可以去setting中配置每页显示多少条
        page.default_limit = 3
        # 每次取得条数
        page.limit_query_param = limit
        # 标杆值,现在偏移到哪个位置,如果offset=6 表示当前在第6条位置上,往后取
        page.offset_query_param = offset
        # 最大取10条
        page.max_limit = 10
        ret_page = page.paginate_queryset(ret, request, self)
        # 序列化
        pub_ser = PublishSerializers(ret_page, many=True)
        # 调用这个方法返回的数据中会有总条数,上一页地址,下一页地址
        return page.get_paginated_response(pub_ser.data)

settings.py

REST_FRAMEWORK = 
    PAGE_SIZE: 3  # 表示每页显示三条

前端展示

技术图片

 

三、cursor游标方式:加密分页,只能看上一页和下一页,速度快

urls.py

url(r^publish/, views.Publish.as_view())

 views.py

from rest_framework.views import APIView
from app01 import models
from rest_framework.pagination import CursorPagination
from rest_framework.serializers import ModelSerializer


class PublishSerializers(ModelSerializer):
    class Meta:
        model = models.Publish
        fields = __all__


class Publish(APIView):
    def get(self, request, *args, **kwargs):
        # 批量添加
        #  ll = []
        #  for i in range(100):
        #      ll.append(models.Publish(name=‘%s出版社‘ % i, city=‘%s城市‘ % i))
        #
        #  models.Publish.objects.bulk_create(ll)
        #  return Response()

        ret = models.Publish.objects.all()
        # 实例化产生一个偏移分页对象
        page = CursorPagination()
        # 三个参数:
        # 每页显示多少条,也可以在settings里设置
        page.page_size = 3
        # 查询的key值
        page.cursor_query_param = cursor
        # 按什么排序
        page.ordering = id
        ret_page = page.paginate_queryset(ret, request, self)
        # 序列化
        pub_ser = PublishSerializers(ret_page, many=True)
        # 去setting中配置每页显示多少条
        # 调用这个方法返回的数据中会有总条数,上一页地址,下一页地址
        return page.get_paginated_response(pub_ser.data)

settings.py

REST_FRAMEWORK = 
    PAGE_SIZE: 3  # 表示每页显示三条

前端展示

技术图片

 

以上是关于分页器的主要内容,如果未能解决你的问题,请参考以下文章

Django组件之分页器

Django框架(十四)—— Django分页组件

Django框架(十五)—— Django分页组件

Django框架(十三)--Django分页组件

8.2 Django 分页组件替换自定义分页

drf--分页