Django Rest framework 之 视图
- RESTful 规范
- django rest framework 之 认证(一)
- django rest framework 之 权限(二)
- django rest framework 之 节流(三)
- django rest framework 之 版本(四)
- django rest framework 之 解析器(五)
- django rest framework 之 序列化(六)
- django rest framework 之 分页(七)
- django rest framework 之 视图(八)
在之前的django rest framework其他组件中,在视图函数中继承类都是rest_framework.view.APIView,这个APIView是继承的django中的View并且做了封装和方法重写的。 那么在django rest framework中,还有有没有提供其他的类能够继承?
一、GenericAPIView
GenericAPIView在django rest framework中根据APIView又做了一层封装。则继承关系就变成了GenericAPIView——>APIView——>View
from rest_framework.generics import GenericAPIView
class GenericView(GenericAPIView):
queryset = Role.objects.get_queryset().order_by('id')
serializer_class = PagerSerializer
pagination_class = PageNumberPagination
def get(self,request,*args,**kwargs):
roles = self.get_queryset()
pager_roles = self.paginate_queryset(roles)
ser = self.get_serializer(instance=pager_roles,many=True)
return Response(ser.data)
这里实现的功能和django rest framework 之 分页中的功能一样,先获取数据,分页,序列化返回。不同的是,这里由于封装的作用,GenericAPIView的内部的一些方法会根据会自动的获取数据库查询结果并分页和序列化。
- get_queryset(): 会获取数据库查询结果,也就是
queryset - paginate_queryset(roles):会根据重写的
pagination_class属性获取分页类进行分页操作,另外如果这里没有重写,会自动到settings.py配置文件去找 - self.get_serializer():就是根据分页后的对象进行数据的序列化,也会先找到序列化类
二、GenericViewSet
1、源码分析
GenericViewSet实际上使用了多继承和Mixin模式,也就是说GenericViewSet同时继承了ViewSetMixin, generics.GenericAPIView两个父类
# rest_framework\viewsets.py 源码
class GenericViewSet(ViewSetMixin, generics.GenericAPIView):
pass
在GenericViewSet中由于类继承的先后顺序的关系,会先执行ViewSetMixin类中相关方法。而GenericAPIView类中的相关方法会被忽略。
2、路由
在执行之前要更改一下路由系统
from django.conf.urls import url
from .views import *
app_name = 'api'
urlpatterns = [
url(r'^generic/$', GenericView.as_view()),
url(r'^genericset/$', GenericSetView.as_view({'get': 'list', 'post': 'create'})),
]
由于在GenericViewSet的内部重写了as_view方法,且继承关系又先于GenericAPIView类,所以会进入GenericViewSet的as_view方法。但是在as_view方法中,对路由系统做了略微的改动,需要对方法,做一一映射关系。即'get': 'list', 'post': 'create',get(获取单条数据)请求,会进入子类的list方法,而create(创建对象)方法则代表了post请求。
3、视图
视图中基本上和上面一样,只不过更改了不同http请求方法的对应类方法名
from rest_framework.viewsets import GenericViewSet
class GenericSetView(GenericViewSet):
queryset = Role.objects.get_queryset().order_by('id')
serializer_class = PagerSerializer
pagination_class = PageNumberPagination
def list(self,request,*args,**kwargs):
# 获取数据
roles = self.get_queryset() # models.Role.objects.all()
# [1, 1000,] [1,10]
pager_roles = self.paginate_queryset(roles)
# 序列化
ser = self.get_serializer(instance=pager_roles,many=True)
return Response(ser.data)
def create(self, request, *args, **kwargs):
ret = {}
try:
title = request.data['title']
Role.objects.create(title=title)
print('success')
except Exception as e:
print(e)
4、测试
<1>、测试一
http://127.0.0.1:8000/api/genericset,get方法获取数据时,返回正常结果

<2>、测试二
http://127.0.0.1:8000/api/genericset/,表示发送post请求添加单条数据,数据添加成功


三、ModelSetView
1、源码分析
ModelSetView做的更彻底,他又一次继承了GenericViewSet,并且在此之前又继承了其他几个类,因此功能更多,变成了ModelViewSet——>GenericViewSet——>APIView——>View
class ModelViewSet(mixins.CreateModelMixin,
mixins.RetrieveModelMixin,
mixins.UpdateModelMixin,
mixins.DestroyModelMixin,
mixins.ListModelMixin,
GenericViewSet):
pass
从这些类的名字可以大概看出,CreateModelMixin,RetrieveModelMixin,UpdateModelMixin,DestroyModelMixin,.ListModelMixin,分别对应,创建,获取单条数据,更新,删除,或许多条数据。
2、路由
from django.conf.urls import url
from django.urls import path
from .views import *
app_name = 'api'
urlpatterns = [
url(r'^modelset/(?P<pk>\d+)/$', ModelSetView.as_view({'get': 'retrieve','delete':'destroy','put':'update','patch':'partial_update'})),
]
由于在获取,删除,更新数据的时候需要这顶数据的唯一标识,这里是pk主键,因此需要在url中增加正则匹配。
3、视图
在视图中,并没有增加相应的增删改查的逻辑却能完成相应的功能,这是因为继承的mixin类中,已经有一一对应的方法,视图类会自动调用父类的方法。
from rest_framework.viewsets import ModelViewSet
class ModelSetView(ModelViewSet):
queryset = Role.objects.get_queryset().order_by('id')
serializer_class = PagerSerializer
pagination_class = PageNumberPagination
获取第九条数据,返回结果

4、自定义
在ModelSetView中看到,继承了多个mixin类,而这些类又分别封装了不同的对应于增删给查的方法,因此如果想要自定义一个接口,实现部分http方法,就可以根据需要继承不同的mixin类
mixins.CreateModelMixin,
mixins.RetrieveModelMixin,
mixins.UpdateModelMixin,
mixins.DestroyModelMixin,
mixins.ListModelMixin,
Django Rest framework 之 视图的更多相关文章
- Django rest framework (视图类详解)
官网:https://www.django-rest-framework.org/api-guide/viewsets/ 在django rest framework 视图中一共有N个类 第一类:AP ...
- DRF Django REST framework 之 视图组件(四)
引言 在我们有几十上百的视图类,都有get,post等方法,在功能类似时,会导致大量的重复代码出现,显然还有很多可以优化的地方.这也就有了视图组件,它的功能非常强大,能很好的优化接口逻辑. 视图组件 ...
- Django rest framework(8)---- 视图和渲染器
django rest framework 之视图 序列化器 PagerSerialiser from rest_framework import serializers from api im ...
- Django Rest framework 之 序列化
RESTful 规范 django rest framework 之 认证(一) django rest framework 之 权限(二) django rest framework 之 节流(三) ...
- Django Rest framework 之 解析器
RESTful 规范 django rest framework 之 认证(一) django rest framework 之 权限(二) django rest framework 之 节流(三) ...
- Django Rest framework 之 版本
RESTful 规范 django rest framework 之 认证(一) django rest framework 之 权限(二) django rest framework 之 节流(三) ...
- Django Rest framework 之 节流
RESTful 规范 django rest framework 之 认证(一) django rest framework 之 权限(二) django rest framework 之 节流(三) ...
- Django Rest framework 之 权限
django rest framework 之 认证(一) django rest framework 之 权限(二) django rest framework 之 节流(三) django res ...
- Django Rest framework 之 认证
django rest framework 官网 django rest framework 之 认证(一) django rest framework 之 权限(二) django rest fra ...
随机推荐
- 多个JDK下TOMCAT运行设置
当OS中含有多个JDK版本时,设置TOMCAT下JAVA环境变量信息的办法: 1.在setclasspath.bat或者setclasspath.sh下设置 set JAVA_HOME=d:\java ...
- [Vue] vue-cli3.0安装
1. node.js安装https://nodejs.org/en/download/ 2.npm的安装 由于新版的nodejs已经集成了npm,所以之前npm也一并安装好了.同样可以通过输入 &qu ...
- mongodb postgresql mysql jsonb对比
mongodb pg mysql jsonb对比 http://erthalion.info/2017/12/21/advanced-json-benchmarks/ 使用禁用jsonb列的压缩 AL ...
- 使用Express构建RESTful API
RESTful服务 REST(Representational State Transfer)的意思是表征状态转移,它是一种基于HTTP协议的网络应用接口风格,充分利用HTTP的方法实现统一风格接口的 ...
- 坑爹的Sun JDK
Sun的这个java.lang.Throwable 源码 设计非常糟糕,完全没有扩展性, 我在IBM 的Java JDK下,继承java.lang.Throwable重新定义了一个ExceptionW ...
- android stdio Error Could not find com.android.tools common 25.2.2
Error:Could not find com.android.tools:common:25.2.2. Searched in the following locations: file:/D:/ ...
- android电量优化 总结
移动设备电池容量小,耗电较快(基本一天一充) ,故我们在应用开发使用相关组件和方法时候必须考虑耗电情况: 一 通过Battery Historian查看手机的耗电状况, 可以知道Android的在 ...
- [转载]sql server 分布式查询
--用openrowset连接远程SQL或插入数据 --如果只是临时访问,可以直接用openrowset --查询示例 select * from openrowset('SQLOLEDB' ,'sq ...
- mac下安装rzsz
1.先安装item2,item2 市类似mac风格的终端 item2 下载地址,http://iterm2.com/downloads.html,下载后解压缩就能运行 2.Install Homebr ...
- 在Storm的Toplogy中设置多数据源Spout
上代码:主要看main方法中的设置. 如下代码是一般情况下的设置方法...Trident中设置多数据源看对应的博客总结 /** * 指定多个数据源 * 数字累加求和 * 先添加storm依赖 */ ...