Django DRF路由与扩展功能的实现

一. 视图集与路由的使用

使用视图集ViewSet,可以将一系列逻辑相关的动作放到一个类中:

  • list() 提供一组数据
  • retrieve() 提供单个数据
  • create() 创建数据
  • update() 保存数据
  • destory() 删除数据

ViewSet视图集类不再实现get()、post()等方法,而是实现动作 action 如 list() 、create() 等。

视图集只在使用as_view()方法的时候,才会将action动作与具体请求方式对应上。

1. 常用的视图集父类

1.ViewSet

继承自APIView 与 ViewSetMixin作用也与APIView基本类似,提供了身份认证、权限校验、流量管理等。

ViewSet主要通过继承ViewSetMixin来实现在调用as_view()时传入字典(如{'get':'list'})的映射处理工作。

在ViewSet中,没有提供任何动作action方法,需要我们自己实现action方法。

2.GenericViewSet

使用ViewSet通常并不方便,因为list、retrieve、create、update、destory等方法都需要自己编写,而这些方法与前面讲过的Mixin扩展类提供的方法同名,所以我们可以通过继承Mixin扩展类来复用这些方法而无需自己编写。但是Mixin扩展类依赖与GenericAPIView,所以还需要继承GenericAPIView。

GenericViewSet就帮助我们完成了这样的继承工作,继承自GenericAPIView与ViewSetMixin,在实现了调用as_view()时传入字典(如{'get':'list'})的映射处理工作的同时,还提供了GenericAPIView提供的基础方法,可以直接搭配Mixin扩展类使用。

3.ModelViewSet

继承自GenericViewSet,同时包括了ListModelMixin、RetrieveModelMixin、CreateModelMixin、UpdateModelMixin、DestoryModelMixin。

4.ReadOnlyModelViewSet

继承自GenericViewSet,同时包括了ListModelMixin、RetrieveModelMixin。

下面我们还是通过案例,为大家演示吧!

首先,先创建一个子应用。

python3 manage.py startapp collect

5. 在collect下新建序列化器类

# collect下的serializers.py文件

from students.models import Student
from rest_framework import serializers

class StudentModelSerializer(serializers.ModelSerializer):

  class Meta:
    model = Student
    fields = ["id", "name", "age", "sex"]
    extra_kwargs = {
      "name": {"max_length": 10, "min_length": 4},
      "age": {"max_value": 150, "min_value": 0},
    }

  def validate_name(self, data):
    if data == "root":
      raise serializers.ValidationError("用户名不能为root!")
    return data

  def validate(self, attrs):
    name = attrs.get('name')
    age = attrs.get('age')

    if name == "alex" and age == 22:
      raise serializers.ValidationError("alex在22时的故事。。。")

    return attrs

class StudentInfoModelSerializer(serializers.ModelSerializer):
  class Meta:
    model = Student
    fields = ["id", "name"]

6. collect下的urls.py

from django.urls import path, re_path
from collect import views

urlpatterns = [
  # 不要在同一个路由的as_view中书写两个同样的键的http请求,会产生覆盖!!!
  # ViewSet
  path('student1/', views.Student1ViewSet.as_view({"get": "get_5"})),
  path('student1/get_5_girl/', views.Student1ViewSet.as_view({"get": "get_5_girl"})),
  re_path(r'^student1/(?P<pk>\d+)/$', views.Student1ViewSet.as_view({"get": "get_one"})),
  # GenericViewSet
  path('student2/', views.Student3GenericViewSet.as_view({"get": "get_5"})),
  path('student2/get_5_girl/', views.Student3GenericViewSet.as_view({"get": "get_5_girl"})),
  # GenericViewSet,可以和模型类进行组合快速生成基本的API接口
  path("students3/", views.Student4GenericViewSet.as_view({"get": "list", "post": "create"})),
  # ModelViewSet 默认提供了5个API接口
  path("students4/", views.Student5ModelViewSet.as_view({"post": "create", "get": "list"})),
  re_path(r"^students4/(?P<pk>\d+)/$", views.Student5ModelViewSet.as_view({"get": "retrieve", "put": "update", "delete": "destroy"})),
  # ReadOnlyModelViewSet
  path("students5/", views.Student6ReadOnlyModelViewSet.as_view({"get": "list"})),
  re_path(r"^students5/(?P<pk>\d+)/$", views.Student6ReadOnlyModelViewSet.as_view({"get": "retrieve"})),

  # 一个视图类中调用多个序列化器
  path("student8/", views.Student8GenericAPIView.as_view()),

  # 一个视图集中调用多个序列化器
  path("student9/", views.Student9ModelViewSet.as_view({"get": "list"})),
  re_path(r"^student9/(?P<pk>\d+)/$", views.Student9ModelViewSet.as_view({"get": "retrieve"})),
]

"""
有了视图集以后,视图文件中多个视图类可以合并成一个,但是,路由的代码就变得复杂了,
需要我们经常在as_view方法 ,编写http请求和视图方法的对应关系,
事实上,在路由中,DRF也提供了一个路由类给我们对路由的代码进行简写。
当然,这个路由类仅针对于 视图集 才可以使用。
"""

# 路由类默认只会给视图集中的基本5个API生成地址[ 获取一条,获取多条,添加.删除,修改数据 ]
from rest_framework.routers import DefaultRouter
# 实例化路由类
router = DefaultRouter()
# router.register("访问地址前缀","视图集类","访问别名")
# 注册视图视图集类
router.register("student7", views.Student7ModelViewSet)

# 把路由列表注册到django项目中
urlpatterns += router.urls

7. collect下的views.py

"""ViewSet视图集,继承于APIView,所以APIView有的功能,它都有,APIView没有的功能,它也没有"""
from rest_framework.viewsets import ViewSet
from students.models import Student
from .serializers import StudentModelSerializer
from rest_framework.response import Response

class Student1ViewSet(ViewSet):
  def get_5(self, request):
    student_list = Student.objects.all()[:5]

    serializer = StudentModelSerializer(instance=student_list, many=True)

    return Response(serializer.data)

  def get_one(self, request, pk):
    student = Student.objects.get(pk=pk)

    serializer = StudentModelSerializer(instance=student)

    return Response(serializer.data)

  def get_5_girl(self, request):
    student_list = Student.objects.filter(sex=False)[:5]

    serializer = StudentModelSerializer(instance=student_list, many=True)

    return Response(serializer.data)

"""如果希望在视图集中调用GenericAPIView的功能,则可以采用下面方式"""
from rest_framework.generics import GenericAPIView

class Student2ViewSet(ViewSet, GenericAPIView):
  queryset = Student.objects.all()
  serializer_class = StudentModelSerializer

  def get_5(self, request):
    student_list = self.get_queryset()[:5]

    serializer = StudentModelSerializer(instance=student_list, many=True)

    return Response(serializer.data)

  def get_one(self, request, pk):
    student = self.get_object()

    serializer = StudentModelSerializer(instance=student)

    return Response(serializer.data)

  def get_5_girl(self, request):
    student_list = self.get_queryset().filter(sex=False)[:5]

    serializer = StudentModelSerializer(instance=student_list, many=True)

    return Response(serializer.data)

"""
上面的方式,虽然实现视图集中调用GenericAPIView,但是我们要多了一些类的继承。
所以我们可以直接继承 GenericViewSet
"""
from rest_framework.viewsets import GenericViewSet

class Student3GenericViewSet(GenericViewSet):
  serializer_class = StudentModelSerializer
  queryset = Student.objects.all()

  def get_5(self, request):
    student_list = self.get_queryset()[:5]

    serializer = self.get_serializer(instance=student_list, many=True)

    return Response(serializer.data)

  def get_5_girl(self, request):
    student_list = self.get_queryset().filter(sex=False)[:5]

    serializer = self.get_serializer(instance=student_list, many=True)

    return Response(serializer.data)

"""
在使用GenericViewSet时,虽然已经提供了基本调用数据集(queryset)和序列化器属性,但是我们要编写一些基本的
API时,还是需要调用DRF提供的模型扩展类 [Mixins]
"""
from rest_framework.viewsets import GenericViewSet
from rest_framework.mixins import ListModelMixin, CreateModelMixin

class Student4GenericViewSet(GenericViewSet, ListModelMixin, CreateModelMixin):
  queryset = Student.objects.all()
  serializer_class = StudentModelSerializer

from rest_framework.viewsets import ModelViewSet

class Student5ModelViewSet(ModelViewSet):
  queryset = Student.objects.all()
  serializer_class = StudentModelSerializer

# 只读模型视图集
from rest_framework.viewsets import ReadOnlyModelViewSet

class Student6ReadOnlyModelViewSet(ReadOnlyModelViewSet):
  queryset = Student.objects.all()
  serializer_class = StudentModelSerializer

# 路由的使用
from rest_framework.decorators import action

class Student7ModelViewSet(ModelViewSet):
  queryset = Student.objects.all()
  serializer_class = StudentModelSerializer

  # methods 指定允许哪些http请求访问当前视图方法
  # detail 指定生成的路由地址中是否要夹带pk值,True为需要
  @action(methods=["GET"], detail=False)
  def get_6(self, request):
    serilizer = self.get_serializer(instance=self.get_queryset().get(pk=6))
    return Response(serilizer.data)

"""在多个视图类合并成一个视图类以后,那么有时候会出现一个类中需要调用多个序列化器"""

"""1. 在视图类中调用多个序列化器"""
"""原来的视图类中基本上一个视图类只会调用一个序列化器,当然也有可能要调用多个序列化器"""
from .serializers import StudentInfoModelSerializer

class Student8GenericAPIView(GenericAPIView):
  queryset = Student.objects.all()

  # GenericAPI内部调用序列化器的方法,我们可以重写这个方法来实现根据不同的需求来调用不同的序列化器
  def get_serializer_class(self):
    if self.request.method == "GET":
      # 2个字段
      return StudentInfoModelSerializer
    return StudentModelSerializer

  def get(self, request):
    """获取所有数据的id和name"""
    student_list = self.get_queryset()

    serializer = self.get_serializer(instance=student_list, many=True)

    return Response(serializer.data)

  def post(self, request):
    """添加数据"""
    data = request.data
    serializer = self.get_serializer(data=data)
    serializer.is_valid(raise_exception=True)
    serializer.save()
    return Response(serializer.data)

"""2. 在一个视图集中调用多个序列化器"""

class Student9ModelViewSet(ModelViewSet):
  queryset = Student.objects.all()

  """要求:
      列表数据list,返回2个字段,
      详情数据retrieve,返回所有字段,
  """
  def get_serializer_class(self):
    # 本次客户端请求的视图方法名 self.action
    if self.action == "list":
      return StudentInfoModelSerializer
    return StudentModelSerializer

二. 扩展功能

为了方便接下来的学习,我们创建一个新的子应用 opt

python3 manage.py startapp opt

因为接下来的功能中需要使用到登录功能,所以我们使用django内置admin站点并创建一个管理员.

创建管理员以后,访问admin站点,先修改站点的语言配置,在settings里修改

LANGUAGE_CODE = 'zh-hans'

1. 认证Authentication

可以在配置文件中配置全局默认的认证方案

REST_FRAMEWORK = {
  'DEFAULT_AUTHENTICATION_CLASSES': (
    'rest_framework.authentication.SessionAuthentication', # session认证
    'rest_framework.authentication.BasicAuthentication',  # 基本认证
  )
}

也可以在每个视图中通过设置authentication_classess属性来设置

opt下的urls.py

from django.urls import path
from opt import views

urlpatterns = [
  path('auth1/', views.Demo1APIView.as_view()),
  path('auth2/', views.Demo2APIView.as_view()),
]

opt下的views.py

from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework.permissions import IsAuthenticated, IsAdminUser

"""用户的认证和权限识别"""

class Demo1APIView(APIView):
  """只允许登录后的用户访问"""
  permission_classes = [IsAuthenticated]

  def get(self, request):
    """个人中心"""
    return Response("个人中心")

class Demo2APIView(APIView):
  """只允许管理员访问"""
  permission_classes = [IsAdminUser]

  def get(self, request):
    """个人中心2"""
    return Response("个人中心2")

2. 权限Permissions

权限控制可以限制用户对于视图的访问和对于具体数据对象的访问。

  • 在执行视图的dispatch()方法前,会先进行视图访问权限的判断
  • 在通过get_object()获取具体对象时,会进行模型对象访问权限的判断

内置提供的权限:

  • AllowAny 允许所有用户
  • IsAuthenticated 仅通过认证的用户
  • IsAdminUser 仅管理员用户
  • IsAuthenticatedOrReadOnly 已经登陆认证的用户可以对数据进行增删改操作,没有登陆认证的只能查看数据。

可以在配置文件中全局设置默认的权限管理类,如:

REST_FRAMEWORK = {
  ....

  'DEFAULT_PERMISSION_CLASSES': (
    'rest_framework.permissions.IsAuthenticated',
  )
}

如果未指明,则采用如下默认配置

'DEFAULT_PERMISSION_CLASSES': (
  'rest_framework.permissions.AllowAny',
)

也可以在具体的视图中通过permission_classes属性来设置。

opt下的urls.py

urlpatterns = [
  path('auth1/', views.Demo1APIView.as_view()),
  path('auth2/', views.Demo2APIView.as_view()),
  # 自定义权限
  path('auth3/', views.Demo3APIView.as_view()),
]

opt下的views.py

# 自定义权限
from rest_framework.permissions import BasePermission

class MyPermission(BasePermission):
  def has_permission(self, request, view):
    """
    针对访问视图进行权限判断
    :param request: 本次操作的http请求对象
    :param view: 本次访问路由对应的视图对象
    :return:
    """
    if request.user.username == "xiaoming":
      return True
    return False

class Demo3APIView(APIView):
  permission_classes = [MyPermission]

  def get(self, request):
    """个人中心3"""
    return Response("个人中心3")

3. 限流Throttling

可以对接口访问的频次进行限制,以减轻服务器压力。

一般用于付费购买次数,投票等场景使用.

可以在配置文件中,使用DEFAULT_THROTTLE_CLASSES 和 DEFAULT_THROTTLE_RATES进行全局配置

REST_FRAMEWORK = {
  # 限流
  'DEFAULT_THROTTLE_CLASSES': ( # 对全局进行设置
    'rest_framework.throttling.AnonRateThrottle',
    'rest_framework.throttling.UserRateThrottle'
  ),
  'DEFAULT_THROTTLE_RATES': {
    'anon': '3/hour',
    'user': '3/minute',
  }
}

DEFAULT_THROTTLE_RATES 可以使用 second, minute, hour 或day来指明周期。

也可以在具体视图中通过throttle_classess属性来配置

opt下的urls.py

urlpatterns = [
  path('auth1/', views.Demo1APIView.as_view()),
  path('auth2/', views.Demo2APIView.as_view()),
  # 自定义权限
  path('auth3/', views.Demo3APIView.as_view()),
  # 限流
  path('auth4/', views.Demo4APIView.as_view()),
]

opt下的views.py

# 限流
from rest_framework.throttling import UserRateThrottle, AnonRateThrottle

class Demo4APIView(APIView):
  # throttle_classes = [UserRateThrottle, AnonRateThrottle] # 全局配置后,这里就不用指定

  def get(self, request):
    """投票页面"""
    return Response("投票页面")

4. 过滤Filtering

对于列表数据可能需要根据字段进行过滤,我们可以通过添加django-fitlter扩展来增强支持。

pip3 install django-filter

在配置文件里进行注册

INSTALLED_APPS = [
  ...
  'django_filters', # 需要注册应用,
]

REST_FRAMEWORK = {
  ...
  'DEFAULT_FILTER_BACKENDS': ('django_filters.rest_framework.DjangoFilterBackend',)
}

在视图中添加filter_fields属性,指定可以过滤的字段。

opt下的urls.py

urlpatterns = [
  path('auth1/', views.Demo1APIView.as_view()),
  path('auth2/', views.Demo2APIView.as_view()),
  # 自定义权限
  path('auth3/', views.Demo3APIView.as_view()),
  # 限流
  path('auth4/', views.Demo4APIView.as_view()),
  # 过滤
  path('data5/', views.Demo5APIView.as_view()),
]

opt下的views.py

# 过滤
from rest_framework.generics import GenericAPIView, ListAPIView
from students.models import Student
from .serializers import StudentModelSerializer
from django_filters.rest_framework import DjangoFilterBackend

class Demo5APIView(ListAPIView):
  queryset = Student.objects.all()
  serializer_class = StudentModelSerializer
  filter_backends = [DjangoFilterBackend] # 全局配置后,这里就不用指定了。
  filter_fields = ['age', "id"] # 声明过滤字段

5. 排序Ordering

对于列表数据,REST framework提供了OrderingFilter过滤器来帮助我们快速指明数据按照指定字段进行排序。

使用方法:

在类视图中设置filter_backends,使用rest_framework.filters.OrderingFilter过滤器,REST framework会在请求的查询字符串参数中检查是否包含了ordering参数,如果包含了ordering参数,则按照ordering参数指明的排序字段对数据集进行排序。

前端可以传递的ordering参数的可选字段值需要在ordering_fields中指明。

opt下的urs.py

urlpatterns = [
  path('auth1/', views.Demo1APIView.as_view()),
  path('auth2/', views.Demo2APIView.as_view()),
  # 自定义权限
  path('auth3/', views.Demo3APIView.as_view()),
  # 限流
  path('auth4/', views.Demo4APIView.as_view()),
  # 过滤
  path('data5/', views.Demo5APIView.as_view()),
  # 排序
  path('data6/', views.Demo6APIView.as_view()),
]

opt下的views.py

# 排序
from rest_framework.filters import OrderingFilter

class Demo6APIView(ListAPIView):
  queryset = Student.objects.all()
  serializer_class = StudentModelSerializer
  filter_backends = [DjangoFilterBackend, OrderingFilter] # 局部配置会覆盖全局配置
  filter_fields = ['id', "sex"]
  ordering_fields = ['id', "age"]

6. 分页Pagination

REST framework提供了分页的支持。

我们可以在配置文件中设置全局的分页方式,如:

REST_FRAMEWORK = {
  'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination',
  'PAGE_SIZE': 100 # 每页数目
}

也可通过自定义Pagination类,来为视图添加不同分页行为。在视图中通过pagination_clas属性来指明。

opt下的urls.py

urlpatterns = [
  path('auth1/', views.Demo1APIView.as_view()),
  path('auth2/', views.Demo2APIView.as_view()),
  # 自定义权限
  path('auth3/', views.Demo3APIView.as_view()),
  # 限流
  path('auth4/', views.Demo4APIView.as_view()),
  # 过滤
  path('data5/', views.Demo5APIView.as_view()),
  # 排序
  path('data6/', views.Demo6APIView.as_view()),
  # 分页
  path('data7/', views.Demo7APIView.as_view()),
]

opt下的views.py

# 分页
from rest_framework.pagination import PageNumberPagination, LimitOffsetPagination

"""1. 自定义分页器,定制分页的相关配置"""
"""
# 页码分页 PageNumberPagination
前端访问形式:GET http://127.0.0.1:8000/opt/data7/?page=4

page=1  limit 0,10
page=2  limit 10,20

# 偏移量分页 LimitOffsetPagination
前端访问形式:GET http://127.0.0.1:8000/opt/data7/?start=4&size=3

start=0 limit 0,10
start=10 limit 10,10
start=20 limit 20,10
"""

class StandardPageNumberPagination(PageNumberPagination):
  """分页相关配置"""
  page_query_param = "page"     # 设置分页页码关键字名
  page_size = 3           # 设置每页显示数据条数
  page_size_query_param = "size"   # 设置指定每页大小的关键字名
  max_page_size = 5         # 设置每页显示最大值

class StandardLimitOffsetPagination(LimitOffsetPagination):
  default_limit = 2         # 默认限制,默认值与PAGE_SIZE设置一致
  limit_query_param = "size"     # limit参数名
  offset_query_param = "start"    # offset参数名
  max_limit = 5           # 最大limit限制

class Demo7APIView(ListAPIView):
  queryset = Student.objects.all()
  serializer_class = StudentModelSerializer
  # 分页
  # 页码分页类
  pagination_class = StandardPageNumberPagination
  # 偏移量分页类
  # pagination_class = StandardLimitOffsetPagination

注意:如果在视图内关闭分页功能,只需在视图内设置

pagination_class = None

到此这篇关于Django DRF路由与扩展功能的实现的文章就介绍到这了,更多相关Django DRF路由与扩展内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • django drf框架自带的路由及最简化的视图

    django-drf框架自带的路由以及最简化的视图,具体内容如下所示: 路由 一.导入模块 from rest_framework.routers import SimpleRouter 二.初始化路由对象 router = SimpleRouter() 三.创建路由 router = SimpleRouter() # 注册各种接口路由 router.register('cars', views.CarModelViewSet, base_name='car') #car为链接的开头,views

  • Django DRF路由与扩展功能的实现

    一. 视图集与路由的使用 使用视图集ViewSet,可以将一系列逻辑相关的动作放到一个类中: list() 提供一组数据 retrieve() 提供单个数据 create() 创建数据 update() 保存数据 destory() 删除数据 ViewSet视图集类不再实现get().post()等方法,而是实现动作 action 如 list() .create() 等. 视图集只在使用as_view()方法的时候,才会将action动作与具体请求方式对应上. 1. 常用的视图集父类 1.Vi

  • Django drf使用Django自带的用户系统的注册功能

    目录 1.阅读Django自带用户系统源码 1.1 阅读User类源码 1.2 阅读AbstractUser类 2.创建自己的User类 2.1 创建验证器 2.2 创建User类 3.创建序列化类 4.创建views类 5.创建路由 6.测试接口 在写登录功能的时候看着网上的视频学着做,然后看了源码的时候发现了一些有意思的功能,因此写这一篇笔记分享给大家. 1.阅读Django自带用户系统源码 1.1 阅读User类源码 系统自带的用户系统的models文件的位置\site-packages\

  • vue与django(drf)实现文件上传下载功能全过程

    目录 文件上传功能 上传后端部分 上传前端部分(vue添加vue.js和node.js,设置eslint) 文件下载功能 下载后端部分 下载前端部分 总结 文件上传功能 上传后端部分 (一)Models.py from django.db import models class FilesModel(models.Model): //模型名(默认表名) name = models.CharField(max_length=20, default='') //name,fle是字段名(file为上

  • Django之路由层

    Django之路由层 URL配置(URLconf)就像Django所支撑网站的目录.它的本指是URL与要为该URL调用的视图函数之间的映射表,你就是以这种方式告诉Django,对于客户端发来的某个URL调用哪一段逻辑代码对应执行. 一.简单的路由配置 from django.urls import path,re_path from app01 import views urlpatterns = [ re_path(r'^articles/2003/$', views.special_case

  • django DRF图片路径问题的解决方法

    前言 其实就是Django RESTful Framework,RESTful一种API的命名风格,主要因为前后端分离开发出现,前后端分离: 用户访问静态文件的服务器,数据全部由ajax请求给到,RESTful风格:数据应该是名词,而动词由HTTP的请求方式来体现,RESTful风格的API给前端返回 结果对象,无论什么请求方式 本文主要介绍了关于django DRF图片路径问题,下面话不多说了,来一起看看详细的介绍吧 问题描述: 为什么DRF中有时候返回的json中图片是带域名的,有时候是不带

  • 浅谈django channels 路由误导

    与django路由有区别 他们都有根路由,但是不一样. django的根路由: urlpatterns = [ path('login/',include('login.urls')), path('',views.home), path('helloapp/', include('helloapp.urls')), path('admin/', admin.site.urls), ] channels的根路由: 只能形如这种样子,URLRouter里面是一个列表,列表当中是具体路由条目. ap

  • Django url 路由匹配过程详解

    1 Django 如何处理一个请求 当一个用户请求Django 站点的一个页面,下面是Django 系统决定执行哪个Python 代码使用的算法: Django 确定使用根 URLconf 模块.通常,这是 ROOT_URLCONF 设置的值(即 settings 中的 ROOT_URLCONF),但如果传入 HttpRequest 对象拥有 urlconf 属性(通过中间件设置),它的值将被用来代替 ROOT_URLCONF 设置.可以在 django/core/handlers/base.p

  • Django drf请求模块源码解析

    DRF 框架,全称为 Django Rest Framework,是 Django 内置模块的扩展,用于创建标准化 RESTful API:它利用 ORM 映射数据库,并自定义序列化数据进行返回,多用于前后端分离项目 项目地址: https://github.com/encode/django-rest-framework 请求模块:request对象 源码入口 APIView类中dispatch方法中的:request=self.iniialize_request(*args, **kwarg

  • Django drf分页器的使用详解

    前言 当后台返回的数据过多时,我们就要配置分页器,比如一页最多只能展示10条等等,drf中默认配置了3个分页面 PageNumberPagination:基础分页器,性能略差 LimitOffsetPagination:偏移分页器 CursorPagination:游标分页器,性能强大 PageNumberPagination 基础分页器PageNumberPagination,数据量越大性能越差. 首先我们在app中创建一个pagination.py文件,然后自定义一个分页器类,继承自Page

随机推荐