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

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

view.py

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

urls.py

 # urls.py

   path("books4/", views.BookInfoSonAPIView.as_view()),
re_path("books4/(?P<pk>\d+)/", views.BookInfo2SonAPIView.as_view()),

2:ViewSet视图集的使用

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

urls.py

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

3、GenericViewSet的使用

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

urls.py

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

4、ModelViewSet的使用

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

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

urls.py

from django.urls import path, re_path
from . import views
urlpatterns = [
# 针对ModelViewSet提供的5个视图方法,路由以下:
  # 针对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"})),
]
												

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. stdcall 函数调用过程(以delphi为例),还有负数的补码

    以delphi下调用stdcall 函数为例,从右往左压栈:procedure TForm1.Button2Click(Sender: TObject);var i:integer;begin i:= ...

  2. spring data jpa Specification 复杂查询+分页查询

    当Repository接口继承了JpaSpecificationExecutor后,我们就可以使用如下接口进行分页查询: /** * Returns a {@link Page} of entitie ...

  3. oracle数据库中的游标

    oracle中的游标,游标的概念与作用,游标的分类,游标的使用. 一,游标的概念与作用 摘自百度百科:游标(Cursor)是处理数据的一种方法,为了查看或者处理结果集中的数据,游标提供了在结果集中一次 ...

  4. 对数据集做标准化处理的几种方法——基于R语言

    数据集——iris(R语言自带鸢尾花包) 一.scale函数 scale函数默认的是对制定数据做均值为0,标准差为1的标准化.它的两个参数center和scale: 1)center和scale默认为 ...

  5. Linux学习--第四天--find、locate、帮助命令、grep、who、w、压缩命令、网络命令、mount

    find 命令格式:find 搜索范围 匹配条件find 搜索范围 匹配条件(搜索范围一定要填写,不写默认为当前文件夹,不包括子文件夹.) find /etc -name init #搜索文件和文件夹 ...

  6. python面向对象--元类

    一个类没有声明自己的元类,默认他的元类就是type,除了使用内置元类type,我们也可以通过继承type来自定义元类,然后使用metaclass关键字参数为一个类指定元类 class Foo: def ...

  7. L3-002 特殊堆栈 (30 分)

    大家都知道“堆栈”是一种“先进后出”的线性结构,基本操作有“入栈”(将新元素插入栈顶)和“出栈”(将栈顶元素的值返回并从堆栈中将其删除).现请你实现一种特殊的堆栈,它多了一种操作叫“查中值”,即返回堆 ...

  8. ubuntu进入纯命令行

    启动按shfit 然后光标在第一行按e 倒数第二行末尾添加quiet splash $vt_handoff 3 然后按CTRL+X或F10引导系统,启动之后就是命令行模式了

  9. CF1260C Infinite Fence 题解(扩欧)

    题目地址 CF1260C 题目大意 现有\(10^{100}\)块木板需要涂漆,第x块如果是x是a的倍数,则涂一种颜色,是b的倍数,则涂另一种颜色.如果既是a又是b的倍数,那么两种颜色都可以涂:如果连 ...

  10. 怎么在html动态实现显示和隐藏效果

    效果目标图: 这个还是比较好实现的,附源码: <!DOCTYPE html> <html> <head> <meta charset="utf-8& ...