django之rest_framework分页组件,版本控制

目录

一,分页组件

1,普通分页(查看第n页,每页显示n条)

2,偏移分页

3,加密分页(只能看上一页和下一页,速度快)

二,版本控制


 

一,分页组件

走可以自定义一个新的类,继承原来的父类,重写自定义变量,使你的类继承自定义的类

在设置中进行全局配置

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)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值