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请求,假如要对数 ...
随机推荐
- linux的mv、cp 命令
用mv命令1.作用mv命令来为文件或目录改名或将文件由一个目录移入另一个目录中.该命令等同于DOS系统下的ren和move命令的组合.它的使用权限是所有用户.2.格式mv [options] 源文件或 ...
- java中关键字final,finally,finalize的区别
-final:作为修饰符关键字,有三种用法: 1,如果一个类被声明为final,则意味着它不能被继承. 2,将变量声明为final,则表示它是一个常量,也就是保证它在使用过程中不被修改,被final修 ...
- 奇葩的狐火浏览器border属性
今天接到一个bug任务,客户反映火狐浏览器访问时某个商品楼层不显示商品.我立即打开我的火狐浏览器发现没有复现这个bug,后来经过一番折腾,才发现火狐浏览器缩放到90%时,商品楼层果然就消失了,而且每台 ...
- Android 在同一个手机上安装多个相同的apk,便于调试
Android studio 在同一个手机上安装多个相同的apk 原文地址:http://yj.itrydo.com/posts/iKJryXL9zkfSGRTZk 先看效果: 1.在我使用ecsli ...
- Linux服务器安装系统之1-LSI阵列卡Raid10配置方法
- 005-sort 命令使用
字符处理命令 sort 排序命令 排序选项: -f, --ignore-case 忽略字母大小写 -n, --numeric-sort 根据字符串数值比较 -r, --reverse 逆序输出排序结果 ...
- 长沙理工大学第十二届ACM大赛-重现赛I 主持人的烦恼 (sort)
链接:https://ac.nowcoder.com/acm/contest/1/I 来源:牛客网 主持人的烦恼 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 131072K,其他语 ...
- 长短时间记忆的中文分词 (LSTM for Chinese Word Segmentation)
翻译学长的一片论文:Long Short-Term Memory Neural Networks for Chinese Word Segmentation 传统的neural Model for C ...
- 与Swing的初见
---------------------------参考菜鸟教程的swing课程学习-------------------- Swing 是一个为Java设计的GUI工具包. Swing是JAVA基 ...
- 【java工具类】AES加密解密
百度百科一下,AES:高级加密标准(英语:Advanced Encryption Standard,缩写:AES),在密码学中又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准.这个标准 ...