为了服务器性能考虑,也为了用户体验,我们不应该一次将所有的数据从数据库中查询出来,返回给客户端浏览器,如果数据量非常大,这对于服务器来讲,可以说是性能灾难,而对于用户来讲,加载速度将会非常慢。
所以,我们需要控制每次返回给客户端多少数据,这就需要用到分页器,接下来,我们一起来看看DRF
的分页器组件。
使用分页器的大概流程 导入模块 from rest_framework.pagination impot PageNumberPagination
获取数据 books = Book.objects.all()
创建分页器对象 paginater = PageNumberPagination()
开始分页 paged_books = paginater.paginate_queryset(books, request)
开始序列化 serialized_books = BooSerializer(paged_books, many = True)
返回数据 return Response(serialized_books.data)
自定义分页器类 新建分自定义分页器类文件 app.untils.app_paginate.DrfPaginate
代码如下:
1 2 3 4 5 6 7 8 9 10 11 from rest_framework.pagination import PageNumberPaginationclass DrfPaginate (PageNumberPagination ): page_size = 3 page_query_param = 'p' max_page_size = 5 page_size_query_param = 'size'
view视图引入自定义分页类 1 2 3 4 5 6 from app.untils.app_paginate import DrfPaginatepagination_class = DrfPaginate
使用postman测试接口: 127.0.0.1:8000/books/?token=15bc0b77b5b942df9ff3b1f773fa2e21&p=4&size=1
结果如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 { "count" : 6 , "next" : "127.0.0.1:8000/books/?p=5&size=1&token=15bc0b77b5b942df9ff3b1f773fa2e21" , "previous" : "127.0.0.1:8000/books/?p=3&size=1&token=15bc0b77b5b942df9ff3b1f773fa2e21" , "results" : [ { "name" : "坏蛋是怎样炼成的IVVVssV" , "price" : "43.20" , "publish_name" : "广州出版社" , "authors_list" : [ "张雪欧" , "刘德华" , "梁朝伟" ] } ] }
view整体代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 from django.http import JsonResponsefrom rest_framework.views import APIViewfrom rest_framework.viewsets import ModelViewSetfrom rest_framework.renderers import JSONRenderer, BrowsableAPIRendererfrom app.models import User as UserModelfrom app.models import UserToken as UserTokenModelfrom app.models import Book as BookModelfrom app.untils import get_tokenfrom app.api_serialize import BookSerializefrom app.untils.authentication import UserAuthfrom app.untils.permission import UserPermissionfrom app.untils.app_throttle import VisitThottlefrom app.untils.app_paginate import DrfPaginateclass UserView (APIView ): def post (self, request ): response = dict () recev_data = {'username' , 'password' } if recev_data.issubset(set (request.data)): userInfo = dict () for item in recev_data: userInfo[item] = request.data.get(item) user_obj = UserModel.objects.filter (**userInfo).first() if user_obj: access_token = get_token.generater_token() UserTokenModel.objects.update_or_create(user=user_obj, defaults={ 'token' :access_token }) response['status_code' ] = 200 response['status_message' ] = '恭喜你,登录成功' response['access_token' ] = access_token response['user_role' ] = user_obj.get_level_display() else : response['status_code' ] = 201 response['status_message' ] = '用户名或密码错误' return JsonResponse(response) class BooksView (ModelViewSet ): queryset = BookModel.objects.all () serializer_class = BookSerialize renderer_classes = [JSONRenderer] pagination_class = DrfPaginate
如需全局使用,需要在setting文件中定义:
1 2 3 4 5 6 7 8 9 10 11 12 13 REST_FRAMEWORK = { 'DEFAULT_THROTTLE_CLASSES' : ['app.untils.app_throttle.VisitThottle' ], 'DEFAULT_THROTTLE_RATES' : { 'visit_rate' : '3/m' }, 'PAGE_SIZE' : 2 }