1、说明:DRF框架中的视图集:

  在drf开发接口中,使用GenericAPIView和视图扩展类结合起来完成接口功能是一件很常见的事情,
所以,drf的作者帮我们提前把  GenericAPIView和视图扩展类结合子类也声明了出来
视图子类中还帮我们定义对应接口的视图方法代码,所以我们无需在视图中重复编写对用的视图方法了。
案例代码:

view.py

  1. from rest_framework.generics import ListAPIView,CreateAPIView # ListAPIView是 GernericAPIView和ListModelMixin的组合子类
  2. class BookInfoSonAPIView(ListAPIView,CreateAPIView):
  3. queryset = BookInfo.objects.all()
  4. serializer_class = BookInfoModelSerializer
  5.  
  6. # from rest_framework.generics import RetrieveAPIView,UpdateAPIView,DestroyAPIView
  7. from rest_framework.generics import RetrieveUpdateDestroyAPIView # 等同于上面同时引入的三个视图子类
  8. class BookInfo2SonAPIView(RetrieveUpdateDestroyAPIView):
  9. queryset = BookInfo.objects.all()
  10. serializer_class = BookInfoModelSerializer

urls.py

  1. # urls.py
  2.  
  3. path("books4/", views.BookInfoSonAPIView.as_view()),
  4. re_path("books4/(?P<pk>\d+)/", views.BookInfo2SonAPIView.as_view()),

2:ViewSet视图集的使用

  1. #继承使用ListAPIView,CreateAPIView,虽然方便,但是明显可以看到,类属性重复了,
    # 如果把两个类的视图都放在一个类下,那么就只能实现一个类视图对应一个http请求的情况
    # 所以drf中提供了视图集帮助我们改变路由和视图方法的绑定关系来解决,即是,通过在视图函数中
    # 来自定义自己写的函数,然后再在路由中改变绑定关系。使其对应不同的http请求
  2.  
  3. #views.py
  1. from rest_framework.viewsets import ViewSet
  2. from booktest.models import BookInfo
  3. from app01.serializers import BookInfoModelSerializer
  4. from rest_framework.response import Response
  5. class BookInfoAPIViewSet(ViewSet):
  6. def get_list(self,request): # 获取所有数据
  7. # 三步走:
  8. # 第一步:操作数据
  9. books=BookInfo.objects.all()
  10. # 第二步:序列化
  11. serializer=BookInfoModelSerializer(instance=books,many=True)
  12. # 第三步:响应数据
  13. return Response(serializer.data)
  14.  
  15. # 获取一条数据
  16. def get_one(self,request,pk):
  17. # 三步骤
  18. # 第一步:操作数据库
  19. book=BookInfo.objects.get(pk=pk)
  20. # 第二步:序列化
  21. serializer=BookInfoModelSerializer(instance=book)
  22. # 第三步:响应信息
  23. return Response(serializer.data)
  24.  
  25. # 获取前五条数据
  26. def get_top5(self,request):
  27. # 三步骤
  28. # 第一步:操作数据
  29. books=BookInfo.objects.order_by("-bread")[:5] # 依据阅读数量查询数据
  30. # 第二步:序列化
  31. serializer=BookInfoModelSerializer(instance=books,many=True)
  32. # 第三步:响应信息
  33. return Response(serializer.data)

urls.py

  1. from django.urls import path,re_path
  2. from . import views
  3.  
  4. urlpatterns=[
  5. # 获取所有数据要走的路由
  6. path("book04/",views.BookInfoAPIViewSet.as_view({"get":"get_list"})),
  7.  
  8. #获取一条数据
  9. re_path("book05/(?P<pk>\d+)/", views.BookInfoAPIViewSet.as_view({"get":"get_one"})),
  10.  
  11. # 查询前五条数据
  12. path("book06/top5/", views.BookInfoAPIViewSet.as_view({"get": "get_top5"})),
  13.  
  14. ]

3、GenericViewSet的使用

  1. # 使用ViewSet通常并不方便,因为list、retrieve、create、update、destory等方法都需要自己编写,而这些方法与前面讲过的Mixin扩展类提供的方法同名,
    # 所以我们可以通过继承Mixin扩展类来复用这些方法而无需自己编写。但是Mixin扩展类依赖与`GenericAPIView`,所以还需要继承`GenericAPIView`。
    # **GenericViewSet**就帮助我们完成了这样的继承工作,继承自`GenericAPIView`与`ViewSetMixin`,在实现了调用as_view()时传入字典
    # (如`{'get':'list'}`)的映射处理工作的同时,还提供了`GenericAPIView`提供的基础方法,可以直接搭配Mixin扩展类使用。
  2.  
  3. views.py
  1. """上面的代码又回到了最初的APIView时代,所以我们可以使用GenericViewSet来简化"""
  2. from rest_framework.viewsets import GenericViewSet
  3. from booktest.models import BookInfo
  4. from app01.serializers import BookInfoModelSerializer
  5. from rest_framework.response import Response
  6. from rest_framework.mixins import ListModelMixin,RetrieveModelMixin
  7. class BookInfoGenericViewSet(GenericViewSet,ListModelMixin,RetrieveModelMixin):
  8. # GenericViewSet 继承了GnericAPIView 所以必须要有以下两个参数
  9. queryset = BookInfo.objects.all() # 指明当前操作的模型数据是什么,
  10. serializer_class = BookInfoModelSerializer # 指明用的是什么序列化器
  11.  
  12. def get_list(self,request):
  13. # 获取所有数据
  14. return self.list(request) # 当前类的方法list,继承了GenricAPIVIew
  15.  
  16. def get_one(self,request,pk):
  17. # 获取一条数据
  18. return self.retrieve(request,pk)

urls.py

  1. from django.urls import path,re_path
  2. from . import views
  3.  
  4. urlpatterns=[
  5. # 查询所有数据
  6. path("book07/", views.BookInfoGenericViewSet.as_view({"get": "get_list"})),
  7. # 查询一条数据
  8. re_path("book07/(?P<pk>\d+)/", views.BookInfoGenericViewSet.as_view({"get": "get_one"})),
  9.  
  10. ]

4、ModelViewSet的使用

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

  1. """对于上面虽然虽然已经简化了很多代码,但是drf中针对常用的5个接口,事实上有提供了预设类给我们直接使用"""
  2. from rest_framework.viewsets import ModelViewSet,ReadOnlyModelViewSet
  3. from booktest.models import BookInfo
  4. from .serializers import BookInfoModelSerializer
  5. from rest_framework.response import Response
  6. class BookInfoModelViewSet(ModelViewSet):
  7. queryset = BookInfo.objects.all()
  8. serializer_class = BookInfoModelSerializer
  9.  
  10. def get_top_5(self,request):
  11. """获取评论值最多的5条数据"""
  12. # 操作数据库
  13. print(self.action) # 获取本次请求的视图方法名
  14. books = BookInfo.objects.order_by("-bread")[:5]
  15. # 序列化
  16. serializer = BookInfoModelSerializer(instance=books,many=True)
  17. # 3, 响应数据
  18. return Response(serializer.data)

urls.py

  1. from django.urls import path, re_path
  2. from . import views
  3. urlpatterns = [
  4. # 针对ModelViewSet提供的5个视图方法,路由以下:
  1.   # 针对ModelViewSet提供的5个视图方法,路由以下:
    path("books08/", views.BookInfoModelViewSet.as_view({"get":"list"})),
    path("books08/", views.BookInfoModelViewSet.as_view({"post":"create"})),
    path("books08/top5/", views.BookInfoModelViewSet.as_view({"get":"get_top_5"})),
    re_path("books08(?P<pk>\d+)/", views.BookInfoModelViewSet.as_view({"get":"retrieve"})),
    re_path("books08(?P<pk>\d+)/", views.BookInfoModelViewSet.as_view({"put":"update"})),
    re_path("books08/(?P<pk>\d+)/", views.BookInfoModelViewSet.as_view({"delete":"destroy"})),
  1. ]
  1.  

DRF中的视图集的使用的更多相关文章

  1. DRF中五大扩展类及视图集的介绍

    五个扩展类 (1)ListModelMixin 列表视图扩展类,提供list(request, *args, **kwargs)方法快速实现列表视图,返回200状态码. 该Mixin的list方法会对 ...

  2. Django中的DRF框架视图集使用

    1. 两个基类 1)APIView Django REST_framework 中所有视图的基类是APIView   父类是View 支持定义的属性: authentication_classes 列 ...

  3. drf框架中所有视图及用法

    0909自我总结 drf框架中所有视图及用法 一.drf框架中的所有视图类 from django.views import View from rest_framework import views ...

  4. 068.Python框架Django之DRF视图集使用

    一 视图集与路由的使用 使用视图集ViewSet,可以将一系列逻辑相关的动作放到一个类中: list() 提供一组数据 retrieve() 提供单个数据 create() 创建数据 update() ...

  5. 对drf视图集的理解

    视图集ViewSet 使用视图集ViewSet,可以将一系列逻辑相关的动作放到一个类中: list() 提供一组数据 retrieve() 提供单个数据 create() 创建数据 update() ...

  6. 使用DRF视图集时自定义action方法

    在我们用DRF视图集完成了查找全部部门,创建一个新的部门,查找一个部门,修改一个部门,删除一个部门的功能后,views.py的代码是这样子的: class DepartmentViewSet(Mode ...

  7. DRF视图集的路由设置

    在使用DRF视图集时,往往需要配一大堆路由,例如: # views.py class DepartmentViewSet(ListModelMixin,CreateModelMixin,Retriev ...

  8. DRF (Django REST framework) 中的视图扩展类

    2. 五个扩展类 1)ListModelMixin 列表视图扩展类,提供list(request, *args, **kwargs)方法快速实现列表视图,返回200状态码. 该Mixin的list方法 ...

  9. DRF中的序列化器

    DRF中的序列化器详细应用   视图的功能:说白了就是接收前端请求,进行数据处理 (这里的处理包括:如果前端是GET请求,则构造查询集,将结果返回,这个过程为序列化:如果前端是POST请求,假如要对数 ...

随机推荐

  1. springmvc,springboot单元测试配置

    1. springmvc单元测试配置 <dependency> <groupId>junit</groupId> <artifactId>junit&l ...

  2. Linux vim程序编辑器

    Tips: 在 vi 里面, [tab] 这个按钮所得到的结果与空格符所得到的结果是不一样的,特别强调一下! 一般模式 移动光标 30↓ 向下移动30行 40→ 向右移动40个字符 gg 移动到档案第 ...

  3. TCP软件环境测试

    利用合宙官网上的云平台->TCP透传云,建立一个TCP服务. http://tcplab.openluat.com/ [注意事项] 如3分钟内没有客户端接入则会自动关闭. 每个服务器最大客户端连 ...

  4. Ubuntu18 给terminal改个漂亮的命令行提示符

    重新安装了VMware和Ubuntu,但是命令行提示符太单调,不美观,如何更改呢.于是在网上巴拉巴拉搜寻一番. 1.更改PS1环境变量,这俩都可以,我选择第一个: export PS1="\ ...

  5. 长沙理工大学第十二届ACM大赛-重现赛 J 武藏牌牛奶促销

    链接:https://ac.nowcoder.com/acm/contest/1/J 来源:牛客网 武藏牌牛奶促销 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 131072K,其他 ...

  6. 控制DIV内容滚动的方法,实现不用拖滚动条就可以看到最新消息

    三种控制DIV内容滚动的方法: 本人qq群也有许多的技术文档,希望可以为你提供一些帮助(非技术的勿加). QQ群:   281442983 (点击链接加入群:http://jq.qq.com/?_wv ...

  7. Flutter SDK安装(windows)

    Flutter集成了Dart,因此不需要单独安装dart-sdk.Flutter的SDK可以从官网下载:https://flutter.io/sdk-archive/#windows 在Flutter ...

  8. IO初步

    1.名称分隔符separator 建议:1.使用 / 表示路径:"D/java300/IO_study/aaa.png" 2.使用常量拼接:"D:"+File. ...

  9. SpringBoot中资源初始化加载的几种方式

    一.问题 在平时的业务模块开发过程中,难免会需要做一些全局的任务.缓存.线程等等的初始化工作,那么如何解决这个问题呢?方法有多种,但具体又要怎么选择呢? 二.资源初始化 1.既然要做资源的初始化,那么 ...

  10. PageOffice修改注册码升级版本

    java: 删除pageoffice.jar所在目录(一般是WEB-INF/lib)下的license.lic文件(若服务器运行时找不到该文件,可在浏览器地址栏里面通过localhost方式访问pos ...