DRF分頁組件

DRF分頁組件三種方式:  django

  models.py:  json

from django.db import models
 
class UserRole(models.Model):
    role = models.CharField(max_length=12)
models.py:

     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'),
]
 
urls.py

  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)#直接返回總數和先後頁連接
 
views.py

  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
 
}
settings.py
相關文章
相關標籤/搜索