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)
其他配置不变;
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)