rest-framework之分页器

1、添加测试数据

views.py

from django.shortcuts import render
from app01 import models
from rest_framework.views import  APIView
from rest_framework.response import  Response
from rest_framework.versioning import URLPathVersioning


class PublishView(APIView):
    versioning_class = URLPathVersioning

    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()


urls.py

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^(?P<version>[v1|v2]+)/publish/', views.PublishView.as_view()),
]


浏览器访问,添加数据http://127.0.0.1:8000/v1/publish/


2、普通分页

views.py

from django.shortcuts import render
from app01 import models
from app01 import serializer
from rest_framework.views import  APIView
from rest_framework.response import  Response
from rest_framework.versioning import URLPathVersioning

# 导入模块
from rest_framework.pagination import PageNumberPagination, LimitOffsetPagination, CursorPagination


class PublishView(APIView):
    versioning_class = URLPathVersioning

    def get(self, request, *args, **kwargs):
        # 第一种,普通分页
        # 查询出所有数据
        ret = models.Publish.objects.all()

        # 实例化产生一个普通分页对象
        page = PageNumberPagination()

        # 每页显示3条
        page.page_size=3

        # 指定查询哪一页的key值;如 ?page=3-->?xxx=3
        page.page_query_param = 'xxx'

        # 前端控制每页显示多少条的查询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 = serializer.PublishSerializers(ret_page, many=True)
        # 还要去setting.py中配置每页显示多少条

        return Response(pub_ser.data)


settings.py

REST_FRAMEWORK = {
    # 每页显示5条
    'PAGE_SIZE':5
}


urls.py

url(r'^(?P<version>[v1|v2]+)/publish/', views.PublishView.as_view()),


serializer.py

from rest_framework.serializers import ModelSerializer
from app01 import models

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


3、偏移分页(在第n个位置,向后查看n条数据)

views.py

from django.shortcuts import render
from app01 import models
from app01 import serializer
from rest_framework.views import  APIView
from rest_framework.response import  Response
from rest_framework.versioning import URLPathVersioning

from rest_framework.pagination import PageNumberPagination, LimitOffsetPagination, CursorPagination


class PublishView(APIView):
    versioning_class = URLPathVersioning

    def get(self, request, *args, **kwargs):
        # 第一种,普通分页
        # 查询出所有数据
        ret = models.Publish.objects.all()

        # 实例化产生一个偏移分页对象
        page = LimitOffsetPagination()

        # 从标杆位置往后取几个,默认取3,也可以指定
        page.default_limit = 3

        # limit表示的是在offset位置处,往后取的数目
        # http://127.0.0.1:8000/v1/publish/?offset=6&limit=4
        page.limit_query_param = 'limit'

        # offset就是标杆值,表示偏移到哪个位置,如果offset=6表示当前在第6条位置上,再往后取
        page.offset_query_param='offset'

        # limit就算写100,最大也只能往后取10条
        page.max_limit=10

        ret_page = page.paginate_queryset(ret, request, self)
        # 序列化
        pub_ser = serializer.PublishSerializers(ret_page, many=True)
        # 还要去setting.py中配置每页显示多少条  # return Response(pub_ser.data)

        # 调用这个方法返回的数据中会有总条数,上一页地址,下一页地
  return page.get_paginated_response(pub_ser.data)

其他配置不变;

image


4、CursorPagination(加密分页,只能看上一页和下一页,速度快)

views.py

from django.shortcuts import render
from app01 import models
from app01 import serializer
from rest_framework.views import  APIView
from rest_framework.response import  Response
from rest_framework.versioning import URLPathVersioning

from rest_framework.pagination import PageNumberPagination, LimitOffsetPagination, CursorPagination


class PublishView(APIView):

    versioning_class = URLPathVersioning

    def get(self, request, *args, **kwargs):
        # 第一种,普通分页
        # 查询出所有数据
        ret = models.Publish.objects.all()

        # 实例化产生一个加密分页对象
        page = CursorPagination()

        # 每页显示的大小
        page.page_size = 3

        # 查询的key值; ?cursor=3
        page.cursor_query_param = 'cursor'

        # 按什么排序
        page.ordering = 'id'

        ret_page = page.paginate_queryset(ret, request, self)
        # 序列化
        pub_ser = serializer.PublishSerializers(ret_page, many=True)
        # 还要去setting.py中配置每页显示多少条

        # return Response(pub_ser.data)
        return page.get_paginated_response(pub_ser.data)


image

posted @ 2020-03-19 15:07  米兰的小铁將  阅读(151)  评论(0编辑  收藏  举报