Django Rest framework 之 分页

1、实例

分页有三种方式html

  • 普通分页,看第n页,每页显示m条数据;
  • 切割分页,在n个位置,向后查看m条数据;
  • 加密分页,这与普通分页方式类似,不过对url中的请求页码进行加密。

一、路由

<1>、主路由

from django.urls import include
from django.conf.urls import url

urlpatterns = [
    url(r'^api/', include('api.urls', namespace='api') ),
]

<2>、app路由

from django.urls import include
from django.conf.urls import url

urlpatterns = [
    url(r'^page/$', PageView.as_view()),
]

二、视图

在不使用django rest framework中的分页组件仍可以达到目的前端

from rest_framework import serializers
from rest_framework.views import APIView
from rest_framework.response import Response

class PagerSerializer(serializers.ModelSerializer):
    class Meta:
        model = Role
        fields = "__all__"


class PageView(APIView):
    def get(self, request , *args, **kwargs):
        roles = Role.objects.get_queryset().order_by('id')
        roles_ser = PagerSerializer(instance=roles, many=True)

        return Response(roles_ser.data)  # 只返回数据

返回结果
数据库

2、使用普通分页

一、自定义分页类

from rest_framework.pagination import PageNumberPagination

class MyPageNumberPagination(PageNumberPagination):
    page_size = 2
    max_page_size = 5
    page_size_query_param = 'size'
    page_query_param = 'page'
  • page_query_param:表示url中的页码参数
  • page_size_query_param:表示url中每页数量参数
  • page_size:表示每页的默认显示数量
  • max_page_size:表示每页最大显示数量,作限制使用,避免忽然大量的查询数据,数据库崩溃

二、视图

class PagerSerializer(serializers.ModelSerializer):
    class Meta:
        model = Role
        fields = "__all__"

class PageView(APIView):
    def get(self, request , *args, **kwargs):
        roles = Role.objects.get_queryset().order_by('id')
        page = MyPageNumberPagination()
        page_roles = page.paginate_queryset(queryset=roles, request=request, view=self)
        roles_ser = PagerSerializer(instance=page_roles, many=True)

        # return Response(roles_ser.data)  # 只返回数据
        return page.get_paginated_response(roles_ser.data)  # 返回先后夜url
  • 首先须要实例化咱们定义的分页类
  • 而且对实例化类进行传参控制
  • 最后将分页后的对象做序列化

三、测试结果

<1>、正常测试

http://127.0.0.1:8000/api/page/
django

<2>、page、size测试

http://127.0.0.1:8000/api/page/?page=2&size=3 表示第二页,每页显示三条数据
api

3、使用普通分页

一、自定义分页类

from rest_framework.pagination import LimitOffsetPagination

class MyLimitOffsetPagination(LimitOffsetPagination):
    default_limit = 2
    limit_query_param = 'limit'
    offset_query_param = 'offset'
    max_limit = 5
  • default_limit:表示默认每页显示几条数据
  • limit_query_param:表示url中本页须要显示数量参数
  • offset_query_param:表示从数据库中的第几条数据开始显示参数
  • max_limit:表示每页最大显示数量,作限制使用,避免忽然大量的查询数据,数据库崩溃

二、视图

class PagerSerializer(serializers.ModelSerializer):
    class Meta:
        model = Role
        fields = "__all__"

class PageView(APIView):
    def get(self, request , *args, **kwargs):
        roles = Role.objects.get_queryset().order_by('id')
        page = MyLimitOffsetPagination()
        page_roles = page.paginate_queryset(queryset=roles, request=request, view=self)
        roles_ser = PagerSerializer(instance=page_roles, many=True)

        # return Response(roles_ser.data)  # 只返回数据
        return page.get_paginated_response(roles_ser.data)  # 返回先后夜url
  • 首先须要实例化咱们定义的分页类
  • 而且对实例化类进行传参控制
  • 最后将分页后的对象做序列化

三、测试结果

<1>、测试结果一

http://127.0.0.1:8000/api/page/?app

<2>、测试结果二

http://127.0.0.1:8000/api/page/?offset=2&limit=3表示从数据库中的第二条数据开始查询三条数据测试

4、使用加密分页

使用加密分页的缘由:若是使用普通分页时,因为向用户提供了可选参数page,用户能够直接跳到数据分页以后的任意页码。可是这样作的后果就是,数据库的负载变大,返回结果的效率缓慢。可是一旦使用加密以后,虽然提供可选参数cursor,可是对页码进行加密,用户没法知道当前页,而是以上一页下一页的方式翻阅数据。有效避免了数据库的负荷。可是就须要向用户提供上一页下一页的url加密

一、自定义分页类

from rest_framework.pagination import LimitOffsetPagination

class MyCursorPagination(CursorPagination):

    cursor_query_param = 'cursor'
    page_size = 2  
    ordering = 'id'
    page_size_query_param = 'size' 
    max_page_size = 5
  • default_limit:表示默认每页显示几条数据
  • cursor_query_param:表示url中页码的参数
  • page_size_query_param:表示每页显示数据量的参数
  • max_page_size:表示每页最大显示数量,作限制使用,避免忽然大量的查询数据,数据库崩溃
  • ordering:表示返回数据的排序方式

二、视图

class PagerSerializer(serializers.ModelSerializer):
    class Meta:
        model = Role
        fields = "__all__"

class PageView(APIView):
    def get(self, request , *args, **kwargs):
        roles = Role.objects.get_queryset().order_by('id')
        page = MyCursorPagination()
        page_roles = page.paginate_queryset(queryset=roles, request=request, view=self)
        roles_ser = PagerSerializer(instance=page_roles, many=True)

        return page.get_paginated_response(roles_ser.data)  # 返回先后夜url
  • 首先须要实例化咱们定义的分页类
  • 而且对实例化类进行传参控制
  • 最后将分页后的对象做序列化
  • 因为要想用户提供可用的上下页接口,因此只能用return page.get_paginated_response(roles_ser.data)作返回

三、测试结果

<1>、测试结果一

http://127.0.0.1:8000/api/page/?url

<2>、测试结果二

http://127.0.0.1:8000/api/page/?cursor=cD0z&size=3这里直接点击下一页url并追加每页显示数据量参数sizespa

5、总结

三种分页中,普通分页与django中的分页基本没有区别。不过要作分页返回给前端数据,就要从数据库中取出数据,而后在作分页序列化。若是用户一下在前几页请求数据库中的最后几页数据,对查询数据库的时延,对数据库的负载较大,就会出现问题,这个时候就可使用加密分页,限制用户的访问,只提供前一页和后一页的接口。

相关文章
相关标签/搜索