DRF中的视图集的使用
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中的视图集的使用的更多相关文章
- DRF中五大扩展类及视图集的介绍
五个扩展类 (1)ListModelMixin 列表视图扩展类,提供list(request, *args, **kwargs)方法快速实现列表视图,返回200状态码. 该Mixin的list方法会对 ...
- Django中的DRF框架视图集使用
1. 两个基类 1)APIView Django REST_framework 中所有视图的基类是APIView 父类是View 支持定义的属性: authentication_classes 列 ...
- drf框架中所有视图及用法
0909自我总结 drf框架中所有视图及用法 一.drf框架中的所有视图类 from django.views import View from rest_framework import views ...
- 068.Python框架Django之DRF视图集使用
一 视图集与路由的使用 使用视图集ViewSet,可以将一系列逻辑相关的动作放到一个类中: list() 提供一组数据 retrieve() 提供单个数据 create() 创建数据 update() ...
- 对drf视图集的理解
视图集ViewSet 使用视图集ViewSet,可以将一系列逻辑相关的动作放到一个类中: list() 提供一组数据 retrieve() 提供单个数据 create() 创建数据 update() ...
- 使用DRF视图集时自定义action方法
在我们用DRF视图集完成了查找全部部门,创建一个新的部门,查找一个部门,修改一个部门,删除一个部门的功能后,views.py的代码是这样子的: class DepartmentViewSet(Mode ...
- DRF视图集的路由设置
在使用DRF视图集时,往往需要配一大堆路由,例如: # views.py class DepartmentViewSet(ListModelMixin,CreateModelMixin,Retriev ...
- DRF (Django REST framework) 中的视图扩展类
2. 五个扩展类 1)ListModelMixin 列表视图扩展类,提供list(request, *args, **kwargs)方法快速实现列表视图,返回200状态码. 该Mixin的list方法 ...
- DRF中的序列化器
DRF中的序列化器详细应用 视图的功能:说白了就是接收前端请求,进行数据处理 (这里的处理包括:如果前端是GET请求,则构造查询集,将结果返回,这个过程为序列化:如果前端是POST请求,假如要对数 ...
随机推荐
- HNUSTOJ-1636 心电图
1636: 心电图 时间限制: 1 Sec 内存限制: 128 MB提交: 583 解决: 231[提交][状态][讨论版] 题目描述 众所周知,ACM/ICPC实验室聚集了一堆学霸Orz 有学霸 ...
- Vue 数据持久化
方法一:使用 localStorage 存储数据 window.localStorage.setItem(key,value) 方法二:使用 vuex-persistedstate插件 vuex 存在 ...
- ioncube扩展的安装详细图文教程,适合所有新手
有些程序在php环境下运行需要安装ionCube Loader的扩展支持,这里跳过介绍这些东西直接说一下怎么让你的主机环境支持这种扩展,顺利的让你的程序运行起来!这个教程适合用云服务器或者独立服务器的 ...
- Netty学习第三章 Linux网络编程使用的I/O模型
一.同步阻塞IO:blocking IO(BIO) 1.过程分析: 当进程进行系统调用时,内核就会去准备数据,当数据准备好后就复制数据到内核缓冲器,复制完成后将数据拷贝到用户进程内存,整个过程都是阻塞 ...
- php内置函数分析之array_column()
PHP_FUNCTION(array_column) { zval *zcolumn = NULL, *zkey = NULL, *data; HashTable *arr_hash; zval *z ...
- 32.密码学知识-SSL/TLS-9——2019年12月19日
9. SSL/TLS "SSL/TLS --- 为了更安全的通信" 本章中我们将学习SSL/TLS的相关知识. SSL/TLS是世界上应用最广泛的密码通信方法.比如说,当在网上商城 ...
- 【python基础】集合方法汇总
一.定义 用于存储一组无序的不重复的数据 二.特点 1. 集合是无序的 2.集合中的元素是不重复的, 唯一的 3.集合中存储的数据必须是不可变的数据类型 4.集合是可变的数据类型 三.语法 set1 ...
- 【GDOI 2016 Day2】第一题 SigemaGO
题目 分析 拆点连边+spfa. 首先把图分成2lim+1层,也就是每个点拆成2lim+1个点. 如果a和b之间.b和c有一条有向边,那么连边(k,a)-->(k+1,b),(k+1,b)--& ...
- linux运维、架构之路-HAProxy反向代理
一.HAProxy介绍 专业反向代理,支持双机热备支持虚拟主机,配置简单,拥有非常不错的服务器健康检查功能,当其代理的后端节点出现故障, HAProxy会自动将该服务器摘除,故障恢复 ...
- SQL server 表copy 到别一张表
SQL server 表copy 到别一张表 ------------------ INSERT INTO 表名 (表字段) SELECT 表1字段 FROM 表名2: ---------- ...