rest framework 分頁,版本

分頁 

分頁器的引入

from rest_framework.pagination import PageNumberPagination, LimitOffsetPagination, CursorPagination

分頁器的建立

PageNumberPagination分頁器

按頁碼數分頁,第n頁,每頁顯示m條數據數據庫

使用URL後端

http://127.0.0.1:8000/api/article/?page=2&size=1 

示例

# PageNumberPagination 方式 分頁器
class MyPageNumberPagination(PageNumberPagination): # 建立一個自定義類繼承分頁器類,自定義類中進行參數設置,自定義類的實例化即爲分頁器對象
        page_size = 1    # 每頁顯示數目    
        page_query_param = 'page'    # url 中的指定 關鍵字 
        page_size_query_param = "size"    # 容許臨時添加的參數 
        max_page_size = 5    # 對臨時添加數據的限制 

        """
            關於臨時添加參數
                 http://127.0.0.1:8000/?page=1&size=2
                 size 爲臨時添加數據 由 page_size_query_param 控制
                 max_page_size 控制 size 的限制 
        """

 

class P2(PageNumberPagination):
    #默認每頁顯示的數據條數
    page_size = 2
    #獲取url參數中設置的每頁顯示數據條數
    page_size_query_param = 'size'
    #獲取url中傳入的頁碼key
    page_query_param = 'page'
    #最大支持的每頁顯示的數據條數
    max_page_size = 5

class IndexView3(APIView):
    #使用http://127.0.0.1:8080/app01/v1/index3/?page=1&page_size=1可進行判斷
    def get(self,request,*args,**kwargs):
        user_list = models.UserInfo.objects.all()
        #實例化分頁對象,獲取數據庫中的分頁數據
        p2 = P2()
        print(p2.page_size_query_description)
        page_user_list = p2.paginate_queryset(queryset=user_list,request=request,view=self)
        print('打印的是分頁的數據',page_user_list)

        #序列化對象
        ser = MySerializes(instance=page_user_list,many=True)  #可容許多個

        #生成分頁和數據
        # return Response(ser.data) #不含上一頁下一頁
        return p2.get_paginated_response(ser.data)

LimitOffsetPagination分頁器

分頁,在n位置,向後查看m條數據api

使用URLapp

http://127.0.0.1:8000/api/article/?offset=2&limit=2

示例

    

# LimitOffsetPagination 方式 分頁器
class MyPageNumberPagination(LimitOffsetPagination):    
        default_limit=1    # 每頁最多顯示多少數目 關鍵詞是 limit 
        """
            LimitOffsetPagination 的分頁器 擁有一個 offset 內置 參數
            http://127.0.0.1:8000/?limit=1&offset=2
            offst 表示向後偏移,偏移塊大小爲 limit的長度
            當前頁1 limit=1 offset=2 表示向下偏移兩個長度 顯示第三頁內容 
        """
from rest_framework.views import APIView
from rest_framework.response import Response
from app01.serializes.myserializes import MySerializes
from rest_framework.pagination import LimitOffsetPagination
from app01 import models

# =========== 能夠本身進行自定製分頁,基於limitoffset===================
class P1(LimitOffsetPagination):
    max_limit = 3  # 最大限制默認是None
    default_limit =2  # 設置每一頁顯示多少條
    limit_query_param = 'limit'  # 日後取幾條
    offset_query_param = 'offset'  # 當前所在的位置

class IndexView2(APIView):
    #使用http://127.0.0.1:8080/app01/v1/index2/?offset=2&limit=4可進行判斷
    def get(self,request,*args,**kwargs):
        user_list = models.UserInfo.objects.all()
        p1 = P1()#註冊分頁
        page_user_list = p1.paginate_queryset(queryset=user_list,request=request,view=self)
        print('打印的是分頁的數據',page_user_list)
        ser = MySerializes(instance=page_user_list,many=True)  #可容許多個
        # return Response(ser.data) #不含上一頁下一頁
        return p1.get_paginated_response(ser.data)

# =======================也能夠用下面這種形式===========
class BaseResponse(object):
    def __init__(self,code=1000,data=None,error=None):
        self.code = code
        self.data = data
        self.error = error
class IndexView(views.APIView):
    '''第二種類表示的方式'''
    def get(self,request,*args,**kwargs):
        ret = BaseResponse()
        try:
            user_list = models.UserInfo.objects.all()
            p1 = P1()
            page_user_list = p1.paginate_queryset(queryset=user_list,request=request,view=self)
            ser = IndexSerializer(instance=page_user_list,many=True)
            ret.data = ser.data
            ret.next = p1.get_next_link()
        except Exception as e:
            ret.code= 1001
            ret.error = 'xxxx錯誤'
        return Response(ret.__dict__)

CursorPagination分頁器

加密分頁,把上一頁和下一頁的id值記住加密

使用URLurl

http://127.0.0.1:8000/api/article/?page=2&size=1 

 

示例spa

基本和 PageNumberPagination 內部字段差很少版本控制

class P3(CursorPagination): 
    # URL傳入的遊標參數
    cursor_query_param = 'cursor'
    # 默認每頁顯示的數據條數
    page_size = 2
    # URL傳入的每頁顯示條數的參數
    page_size_query_param = 'size'
    # 每頁顯示數據最大條數
    max_page_size = 3
# 根據ID從大到小排列 ordering = "id" class IndexView4(APIView): #使用http://127.0.0.1:8080/app01/v1/index4/?cursor=cj0xJnA9NA%3D%3D&size=3可進行判斷 def get(self,request,*args,**kwargs): user_list = models.UserInfo.objects.all().order_by('-id') p3 = P3()#註冊分頁 page_user_list = p3.paginate_queryset(queryset=user_list,request=request,view=self) print('打印的是分頁的數據',page_user_list) ser = MySerializes(instance=page_user_list,many=True) #可容許多個 # return Response(ser.data) #不含上一頁下一頁 return p3.get_paginated_response(ser.data)

分頁器的使用

# 分頁器的使用一:未封裝起來的時候
class BookViewSet(viewsets.ModelViewSet):
    queryset = Book.objects.all()
    serializer_class = BookSerializers
    def list(self,request,*args,**kwargs):
        book_list=Book.objects.all()
        # 調用分頁器類實例化 (根據分頁器類型要作區分)
        pp=LimitOffsetPagination()        
        # 對分頁器對象賦值使用 實例化自定義分頁類
            # 參數 queryset=被分頁的queryset對象,後兩個固定便可
        pager_books=pp.MyPageNumberPagination(queryset=book_list,request=request,view=self)
        bs=BookSerializers(pager_books,many=True)
        return pp.get_paginated_response(bs.data)


# 分頁器的使用二:封裝起來的時候
class AuthorModelView(viewsets.ModelViewSet):
    queryset = Author.objects.all()
    serializer_class = AuthorModelSerializers    # 序列化組件
    pagination_class = MyPageNumberPagination    # 分頁組件,分頁器只能使用一個,此處不能夠爲列表


# 分頁器的使用三: 全局生效,在settings.py 中設置
REST_FRAMEWORK = {
    'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.LimitOffsetPagination',
    'PAGE_SIZE': 100
}
 

 

 

版本

爲何須要版本控制

API 版本控制容許咱們在不一樣的客戶端之間更改行爲(同一個接口的不一樣版本會返回不一樣的數據)。 DRF提供了許多不一樣的版本控制方案。rest

可能會有一些客戶端由於某些緣由再也不維護了,可是咱們後端的接口還要不斷的更新迭代,這個時候經過版本控制返回不一樣的內容就是一種不錯的解決方案。code

內置版本類型

 DRF提供了五種版本控制方案

 版本的建立使用

# 版本控制
    # 1. 配置文件中加入
REST_FRAMEWORK = {
    # 全局配置版本
    # "DEFAULT_VERSIONING_CLASS": "rest_framework.versioning.QueryParameterVersioning",
    #     # 配置默認容許版本
    # "ALLOWED_VERSIONS": ["v1", "v2"],
    #     # 配置默認版本
    # "DEFAULT_VERSION": "v1",
    #     # 配置參數
    # "VERSION_PARAM": "version",

    # 仍是推薦用 URLPathVersioning 的方式來控制版本更好用一些
    "DEFAULT_VERSIONING_CLASS": "rest_framework.versioning.URLPathVersioning",
}  
    # 2. 設置路由 
urlpatterns = [
    url(r'^(?P<version>[v1|v2]+)/api/', include("api.urls")),
]
    # 3 獲取版本
        request.version

ps:

  一般咱們是不會單獨給某個視圖設置版本控制的,若是你確實須要給單獨的視圖設置版本控制,你能夠在視圖中設置versioning_class屬性

class PublisherViewSet(ModelViewSet):

    ...
    versioning_class = URLPathVersioning

  在視圖中自定義具體的行爲,不一樣的版本返回不一樣的序列化類

class PublisherViewSet(ModelViewSet):

    def get_serializer_class(self):
        """不一樣的版本使用不一樣的序列化類"""
        if self.request.version == 'v1':
            return PublisherModelSerializerVersion1
        else:
            return PublisherModelSerializer
    queryset = models.Publisher.objects.all()
相關文章
相關標籤/搜索