1. 程式人生 > >Django框架(二十六)—— Django rest_framework-分頁器與版本控制

Django框架(二十六)—— Django rest_framework-分頁器與版本控制

目錄

分頁器與版本控制

一、三種分頁器

普通分頁

偏移分頁

加密分頁

二、分頁器

# 路由
url(r'^books/', views.Book.as_view({'get':'get_all'}))

1、普通分頁(PageNumberPagination)

http://127.0.0.1:8000/books/?aa=2&size=4
from rest_framework.pagination import PageNumberPagination

class Book(ViewSetMixin, APIView):
    def get_all(self, request):
        response = {'status': 100, 'msg': '查詢成功'}
        book_list = models.Book.objects.all()
        # 例項化產生一個分頁物件
        # 不繼承來修改物件的值
        page=PageNumberPagination()
        page.page_size=2   # 每頁顯示的個數
        page.page_query_param='pag'    # 路由中?後面的key,指定頁碼
        page.page_size_query_param = 'size'   # 指定當前頁顯示多少條
        page.max_page_size = 5  # 每頁最多顯示多少條
        # 第一個引數:要分頁的資料,第二個引數request物件,第三個引數,當前檢視物件
        page_list = page.paginate_queryset(book_list, request, self)
        # 再序列化的時候,用分頁之後的資料
        ser = mySer.BookSerializer(instance=page_list, many=True)
        # 會帶著連結,和總共的條數(不建議用,會把總資料條數返回)
        # return page.get_paginated_response(ser.data)
        return Response(ser.data)
    
REST_FRAMEWORK = {
    # 每頁顯示兩條
    'PAGE_SIZE':2
}

結果:

2、偏移分頁(LimitOffsetPagination)

http://127.0.0.1:8000/books/?offset=2&limit=2
from rest_framework.pagination import LimitOffsetPagination

class Book(ViewSetMixin, APIView):
    def get_all(self, request):
        response = {'status': 100, 'msg': '查詢成功'}
        book_list = models.Book.objects.all()
        # 例項化產生一個偏移分頁物件
        page=LimitOffsetPagination()
        page.default_limit = 3   # 每頁顯示的條數 
        page.offset_query_param = 'offset'     # 從哪一頁開始的標杆的key,如 offset=3
        page.limit_query_param = 'limit'    # 往後偏移多少的key值,如 limit=4
        page.max_limit = 5      # 每頁顯示最大的條數 
        page_list = page.paginate_queryset(book_list, request, self)
        ser = mySer.BookSerializer(instance=page_list, many=True)
        return Response(ser.data)

結果:

3、加密分頁(CursorPagination)

http://127.0.0.1:8000/books/?cursor=cj0xJnA9MTA%3D
from rest_framework.pagination import CursorPagination


class Book(ViewSetMixin, APIView):
    def get_all(self, request):
        book_list = models.Book.objects.all()
        # 例項化產生一個加密分頁物件
        page = CursorPagination()
        page.page_size = 3  # 每頁顯示多少條
        page.ordering = 'nid'  # 按nid排序
        page.cursor_query_param = 'cursor'  # 查詢的key值
        page_list = page.paginate_queryset(book_list, request, self)
        ser = mySer.BookSerializer(instance=page_list, many=True)
        return page.get_paginated_response(ser.data)

結果:

三、版本控制

1、使用

# 路由層
url(r'^(?P<version>v[123]+)/books/$', views.Book.as_view({'get':'get_all'})),
# settings
REST_FRAMEWORK = {
    # 'DEFAULT_VERSIONING_CLASS':'',  # 全域性配置版本控制類
    'VERSION_PARAM':'version',
    'DEFAULT_VERSION':'v1',
    'ALLOWED_VERSIONS': ['v1', 'v2'],
}
# 檢視層
from rest_framework.versioning import URLPathVersioning, QueryParameterVersioning, AcceptHeaderVersioning
# QueryParameterVersioning, AcceptHeaderVersioning 不常用

class Book(ViewSetMixin, APIView):
    # 重定義 versioning_class
    versioning_class = URLPathVersioning

    def get_all(self, request,*args,**kwargs):
        # 可以從request中獲取版本號
        print(request.version)
        book_list = models.Book.objects.all()
        # 例項化產生一個加密分頁物件
        page = CursorPagination()
        page.ordering = 'nid'
        page_list = page.paginate_queryset(book_list, request, self)
        ser = mySer.BookSerializer(instance=page_list, many=True)
        return page.get_paginated_response(ser.data)

2、反向解析

# 路由層
url(r'^(?P<version>v[123]+)/books/$', views.Book.as_view({'get':'get_all'},name='ttt')),
# 1.反向解析獲取路由
from django.urls import reverse
url2=reverse(viewname='ttt',kwargs={'version':request.version})
print(url2)

# 2.利用提供的解析
url2=request.versioning_scheme.reverse('ttt',request=request)
print(url2)
class Book(ViewSetMixin, APIView):
    versioning_class = URLPathVersioning

    def get_all(self, request,*args,**kwargs):
        # 從request中獲取版本號
        print(request.version)
        book_list = models.Book.objects.all()
        # 例項化產生一個加密分頁物件
        page = CursorPagination()
        page.ordering = 'nid'
        page_list = page.paginate_queryset(book_list, request, self)
        ser = mySer.BookSerializer(instance=page_list, many=True)
        return page.get_paginated_response(ser.data)