Django框架(二十六)—— Django rest_framework-分頁器與版本控制
阿新 • • 發佈:2018-12-18
目錄
分頁器與版本控制
一、三種分頁器
普通分頁
偏移分頁
加密分頁
二、分頁器
# 路由 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)