rest-framework之分页
常规分页
from rest_framework.pagination import PageNumberPagination,LimitOffsetPagination,CursorPagination class PublishView(APIView): versioning_class =URLPathVersioning parser_classes =[JSONParser,] def get(self,request,*args,**kwargs): #批量添加 # l1 = [] # for i in range(100): # l1.append(models.Publish(name='%s出版社'%i,city='%s城市'%i)) # models.Publish.objects.bulk_create(l1) #分页的第一种方式 #查询出所有数据 ret = models.Publish.objects.all() #实例化产生一个普通分页对象 page = PageNumberPagination() #手动配置每一页显示个数 page.page_size=5 #手动配置路径上查询页的key的名称 page.page_query_param = 'zyl' #下面两个是成对的必去一起写 #手动配饰路径上显示最多信息条数的key,比如size=10,如果改成zyl就是zyl=10 page.page_size_query_param = 'size' #限制每一页最多显示的页数,如果size=100,每一页显示的还是10条 page.max_page_size = 10 #ret是分页的所有数据,有个返回结果就是分页之后的数据,是个列表 ret_page = page.paginate_queryset(ret,request,self) #序列化 pub_ser = PublishSerializers(ret_page,many=True) #去settings里面配置每一页显示多少条 # 'PAGE_SIZE':2 #每页显示两条信息 return Response(pub_ser.data)
settings.py
REST_FRAMEWORK = { # 每页显示两条 'PAGE_SIZE':2 }
偏移分页
def get(self,request,*args,**kwargs): #分页的第二种方式 #查询出所有数据 ret = models.Publish.objects.all() #实例化产生一个普通分页对象 page = LimitOffsetPagination() #这里参数就不一样了 #从标杆位置往后取几个,默认取三个,也可以指定 page.default_limit = 3 #每次取的条数,可以自定义key值 page.limit_query_param = 'limit' #标杆值,offset=6 就是在第六个位置往后拿三条 page.offset_query_param = 'offset' #对大取10条 page.max_limit = 10 #ret是分页的所有数据,有个返回结果就是分页之后的数据,是个列表 ret_page = page.paginate_queryset(ret,request,self) #序列化 pub_ser = PublishSerializers(ret_page,many=True) #去settings里面配置每一页显示多少条 # 'PAGE_SIZE':2 #每页显示两条信息 return page.get_paginated_response(pub_ser.data) # return Response(pub_ser.data)
这里会把总条数,上一页的地址,写一页的地址返回给你
游标分页
def get(self,request,*args,**kwargs): #分页的第三种方式 #查询出所有数据 ret = models.Publish.objects.all() #实例化产生一个普通分页对象 page = CursorPagination() #每一个显示的条数 page.page_size = 3 page.cursor_query_param = 'cursor' #按什么排序 page.ordering='id' #ret是分页的所有数据,有个返回结果就是分页之后的数据,是个列表 ret_page = page.paginate_queryset(ret,request,self) #序列化 pub_ser = PublishSerializers(ret_page,many=True) #去settings里面配置每一页显示多少条 # 'PAGE_SIZE':2 #每页显示两条信息 return page.get_paginated_response(pub_ser.data) # return Response(pub_ser.data)
这里我们就不知道填什么了所以就要用到
这里测cursor是加密的。也不能指定哪一页。