DRF分頁組件三種方式: django
models.py: json
from django.db import models class UserRole(models.Model): role = models.CharField(max_length=12)
urls.py api
from django.conf.urls import url from api import views urlpatterns = [ url(r'^(api/v1/roles/', views.UserRoleView.as_view(), name='role'), ]
views.pysession
from api import models from rest_framework.views import APIView from rest_framework import serializers from django.http.response import JsonResponse from rest_framework.pagination import PageNumberPagination,LimitOffsetPagination,CursorPagination #分頁組件(能夠直接在全局配置PAGE_SIZE指定每頁顯示條數使用,也可再自定義類進行繼承重寫屬性) ''' #(1)第page頁,page_size條 PageNumberPagination #(2)從offset位置開始,獲取limit頁 LimitOffsetPagination #(3)加密cursor遊標頁碼,自帶排序!!!,自動上一頁下一頁 CursorPagination ''' #序列化器 class UserRoleSerializer1(serializers.ModelSerializer): class Meta: model = models.UserRole fields = "__all__" #(2-1)自定義分頁類----繼承PageNumberPagination--http://127.0.0.1:8000/api/v1/roles/?page=3&page_size=4 class MyPageNumberPagination(PageNumberPagination): #①定義每頁默認顯示數量--能夠在settings.py中定義PAGE_SIZE便可或者在此定義 page_size = 2 #②定義頁碼查詢參數,默認page,不指定值默認從1開始 page_query_param = 'page' #③定義每頁顯示數量查詢參數,無默認值,不指定值爲默認數量 page_size_query_param = 'page_size' #④定義頁面顯示最大數量(只針對指定page_size時生效),默認值None max_page_size = 1 # (2-2)自定義分頁類----繼承LimitOffsetPagination--http://127.0.0.1:8000/api/v1/roles/?offset=9&limit=9 class MyLimitOffsetPagination(LimitOffsetPagination): # ①定義每頁默認顯示數量--能夠在settings.py中定義PAGE_SIZE便可或者在此定義 default_limit = 2 #②定義查詢顯示數量查詢參數,默認limit,不指定值則爲默認數量 limit_query_param = 'limit' # ③定義查詢起始位置參數,默認offset,不指定值默認從0開始 offset_query_param = 'offset' # ④定義頁面顯示最大數量(只針對指定limit時生效),默認值None max_limit = 10 # (2-3)自定義分頁類----繼承CursorPagination--http://127.0.0.1:8000/api/v1/roles/?size=12 class MyCursorPagination(CursorPagination): # ①定義每頁默認顯示數量--能夠在settings.py中定義PAGE_SIZE便可或者在此定義 page_size = 2 #②指定頁碼查詢參數,默認cursor,可是不能爲其指定值,CursorPagination對頁碼自行加密了 cursor_query_param = 'cursor' # ③定義每頁顯示數量查詢參數,無默認值,不指定值爲默認數量 page_size_query_param = 'size' # ④定義頁面顯示最大數量(只針對指定size時生效),默認值None max_page_size = 10 #⑤定義排序字段(加負號表示逆序),能夠指定單個字段,或者列表,元組 # ordering = '-id' ordering =('-id','role') class UserRoleView(APIView): filter_backends = ['id'] def get(self,request,*args,**kwargs): #1、獲取數據 roles = models.UserRole.objects.all() #2、分頁:實例化分頁對象page #(1)自帶分頁組件類(必須在settings.py配置PAGE_SIZE每頁顯示條數) ''' #(1-1)PageNumberPagination--#http://127.0.0.1:8000/api/v1/roles/?page=4(不指定page默認第一頁,取PAGE_SIZE個) # page = PageNumberPagination() #(1-2)LimitOffsetPagination--#http://127.0.0.1:8000/api/v1/roles/?offset=1&limit=1(指定offset開始位置默認0,不指定limit默認取PAGE_SIZE個) # page = LimitOffsetPagination() #(1-3)CursorPagination--自帶排序功能(ordering參數指定排序字段,默認ordering = '-created',通常都是自定義使用,自動對頁碼cursor加密)http://127.0.0.1:8000/api/v1/roles/ # page = CursorPagination() ''' #(2)自定義分頁類(繼承相關類) # page =MyPageNumberPagination()#(2-1) # page =MyLimitOffsetPagination()#(2-2) page =MyCursorPagination()#(2-3) page_roles=page.paginate_queryset(roles,request,view=self) #3、數據序列化 ser_roles = UserRoleSerializer1(instance=page_roles,many=True) ret =ser_roles.data #4、返回數據 # return JsonResponse(ret,safe=False,json_dumps_params={'ensure_ascii':False})#注意序列化結果多條是個列表 return page.get_paginated_response(ret)#直接返回總數和先後頁連接
settings.py app
INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'api.apps.ApiConfig', 'rest_framework', ] REST_FRAMEWORK = { #分頁組件 'PAGE_SIZE':3 }