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. CSP-S全国模拟赛第二场 【nan】

    A.count 本场比赛最难的题... 隔板法组合数容斥 xjb 搞搞就好了 //by Judge #include<cstdio> #include<iostream> #d ...

  2. 剑指offer-动态规划-贪心算法--剪绳子-python

    题目描述 给你一根长度为n的绳子,请把绳子剪成m段(m.n都是整数,n>1并且m>1),每段绳子的长度记为k[0],k[1],...,k[m].请问k[0]xk[1]x...xk[m]可能 ...

  3. MySQL参数化有效防止SQL注入

    sql语句的参数化,可以有效防止sql注入 注意:此处不同于python的字符串格式化,全部使用%s占位 from pymysql import * def main(): find_name = i ...

  4. NOTIFY - 生成一个通知

    SYNOPSIS NOTIFY name DESCRIPTION 描述 NOTIFY 命令向当前数据库中所有执行过 LISTEN name, 正在监听特定通知条件的前端应用发送一个通知事件. 传递给前 ...

  5. grep 查找文件

    --递归查找目录下含有该字符串的所有文件 grep -rn "data_chushou_pay_info" /home/hadoop/nisj/automationDemand/ ...

  6. 统计学习方法——第四章朴素贝叶斯及c++实现

    1.名词解释 贝叶斯定理,自己看书,没啥说的,翻译成人话就是,条件A下的bi出现的概率等于A和bi一起出现的概率除以A出现的概率. 记忆方式就是变后验概率为先验概率,或者说,将条件与结果转换. 先验概 ...

  7. 常用windbg命令(转)

    1.查看版本信息:version.vertarget. 2.查看模块信息:lm.!dlls.!lmvi等. 3.调用栈:用k命令显示调用栈,用.frames命令切换栈帧. 4.内存操作:读内存用d命令 ...

  8. hadoop学习一

    一.基本概念https://blog.csdn.net/gwd1154978352/article/details/81095592 二.安装hadoophttps://blog.csdn.net/s ...

  9. java IO操作分类

  10. Ansible环境搭建

    Installation Guide(Ansible官网链接) Basics / What Will Be Installed What Version To Pick? Control Machin ...