分页有三种方式html
from django.urls import include from django.conf.urls import url urlpatterns = [ url(r'^api/', include('api.urls', namespace='api') ), ]
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) # 只返回数据
返回结果
数据库
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'
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
http://127.0.0.1:8000/api/page/
django
http://127.0.0.1:8000/api/page/?page=2&size=3
表示第二页,每页显示三条数据
api
from rest_framework.pagination import LimitOffsetPagination class MyLimitOffsetPagination(LimitOffsetPagination): default_limit = 2 limit_query_param = 'limit' offset_query_param = 'offset' max_limit = 5
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
http://127.0.0.1:8000/api/page/?
app
http://127.0.0.1:8000/api/page/?offset=2&limit=3
表示从数据库中的第二条数据开始查询三条数据测试
使用加密分页的缘由:若是使用普通分页时,因为向用户提供了可选参数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
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)
作返回http://127.0.0.1:8000/api/page/?
url
http://127.0.0.1:8000/api/page/?cursor=cD0z&size=3
这里直接点击下一页url
并追加每页显示数据量参数size
spa
三种分页中,普通分页与django中的分页基本没有区别。不过要作分页返回给前端数据,就要从数据库中取出数据,而后在作分页序列化。若是用户一下在前几页请求数据库中的最后几页数据,对查询数据库的时延,对数据库的负载较大,就会出现问题,这个时候就可使用加密分页,限制用户的访问,只提供前一页和后一页的接口。