目录
一,分页组件
走可以自定义一个新的类,继承原来的父类,重写自定义变量,使你的类继承自定义的类
在设置中进行全局配置
REST_FRAMEWORK = { # 每页显示两条 'PAGE_SIZE':2, }
1,普通分页(查看第n页,每页显示n条)
可以设置以及携带的参数(page=2)
# 每页显示多少条 page_size = 3 # 查询的时候,?后面带的数据的名称 page_query_param = 'aa' # 指定当前页显示多少条(?后面带的数据名称) page_size_query_param = 'size' # 每页最多显示多少条 max_page_size = 4
# 普通分页 from rest_framework.viewsets import ViewSetMixin from rest_framework.views import APIView from rest_framework.pagination import PageNumberPagination from app01 import mySer class Book(ViewSetMixin, APIView): def get_all(self, request): response = {'status': 100, 'msg': '查询成功'} book_list = models.Book.objects.all() # 实例化产生一个分页对象 # page = PageNumberPagination() page = MyPageNumberPagination() # 第一个参数:要分页的数据,第二个参数request对象,第三个参数,当前视图对象 page_list = page.paginate_queryset(book_list, request, self) # 再把分页之后的数据进行序列化 ser = mySer.BookSerializer(instance=page_list, many=True) response['data'] = ser.data # 返回的数据会带有链接,和总共的条数(不建议使用) return page.get_paginated_response(ser.data) # return Response(ser.data) # return JsonResponse(response)
2,偏移分页
可以设置或者携带的参数(limit=n&offset=m)从m+1条开始显示,显示m条
# 偏移分页 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 = MyPageNumberPagination() # page.default_limit = 3 # page.max_limit=5 #每页显示的条数 default_limit = api_settings.PAGE_SIZE #标杆值(key) offset_query_param = 'offset' #往后偏移多少(key) limit_query_param = 'limit' #每页显示最大的条数 max_limit = None # offset是从几后面开始,limit是显示几条,在发送请求的时候携带数据 page_list = page.paginate_queryset(book_list, request, self) ser = mySer.BookSerializer(instance=page_list,many=True) # return Response(ser.data) return page.get_paginated_response(ser.data)
3,加密分页(只能看上一页和下一页,速度快)
# 加密分页 from rest_framework.pagination import CursorPagination class Book(ViewSetMixin, APIView): def get_all(self, request): response = {'status': 100, 'msg': '查询成功'} book_list = models.Book.objects.all() # 实例化产生一个加密分页的对象 page = CursorPagination() page.page_size=3 page.ordering = 'nid' #查询的key值 cursor_query_param = 'cursor' #每页显示多少条 page_size = api_settings.PAGE_SIZE 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) return page.get_paginated_response(ser.data)
二,版本控制
先在设置中写
REST_FRAMEWORK = { # 'DEFAULT_VERSIONING_CLASS':'', 'VERSION_PARAM':'version', 'DEFAULT_VERSION':'v1', 'ALLOWED_VERSIONS': ['v1', 'v2'], }
然后匹配路由,在视图层匹配响应的视图类,设置方法接收然后print(request.version)即可
- 内置的版本控制
from rest_framework.versioning import QueryParameterVersioning,AcceptHeaderVersioning,NamespaceVersioning,URLPathVersioning #基于url的get传参方式:QueryParameterVersioning------>如:/users?version=v1 #基于url的正则方式:URLPathVersioning------>/v1/users/ #基于 accept 请求头方式:AcceptHeaderVersioning------>Accept: application/json; version=1.0 #基于主机名方法:HostNameVersioning------>v1.example.com #基于django路由系统的namespace:NamespaceVersioning------>example.com/v1/users/
- 局部使用
#在CBV类中加入 versioning_class = URLPathVersioning
- 全局使用
REST_FRAMEWORK = { 'DEFAULT_VERSIONING_CLASS':'rest_framework.versioning.QueryParameterVersioning', 'DEFAULT_VERSION': 'v1', # 默认版本(从request对象里取不到,显示的默认值) 'ALLOWED_VERSIONS': ['v1', 'v2'], # 允许的版本 'VERSION_PARAM': 'version' # URL中获取值的key }
- 路由反向解析(下面两种方法是一样的)
from django.urls import reverse url2 = reverse(viewname='ttt', kwargs={'version': request.version}) print(url2) # 用提供好的request.version_scheme为解析版本的对象 url2 = request.versioning_scheme.reverse(viewname='ttt', request=request) print(url2)