【DRF视图】
请结合【DRF序列化】此文献中的数据文件及序列化文件来阅读如下代码.
DRF视图为我们提供了非常简便的方法——内置了增删改查等一系列的操作.
我们只需在url中指定对应的方法,视图继承内置方法的类,即可实现两三行代码搞定一个请求.
@
我们先看看仿照内置方法实现的
APIView视图文件:
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework.viewsets import ViewSetMixin
""" ===================== 一层封装 ===================== """
class GenericAPIView(APIView):
queryset = None
serializer_class = None
def get_queryset(self):
"""用于获取queryset的方法"""
return self.queryset.all()
def get_serializer(self, *args, **kwargs):
"""用于调用序列化类的方法"""
return self.serializer_class(*args, **kwargs)
class ListModelMixin():
"""用于返回get请求所有数据的数据"""
def list(self, request):
queryset = self.get_queryset() # self调用的方法(get_queryset)是从执行此方法(list)的当前对象的类中开始找
ser_obj = self.get_serializer(queryset, many=True) # 原理同上句话
return Response(ser_obj.data)
class CreateModelMixin():
"""用于处理post请求发来的数据"""
def create(self, request):
ser_obj = self.get_serializer(data=request.data)
if ser_obj.is_valid():
ser_obj.save()
return Response(ser_obj.validated_data)
return Response(ser_obj.errors)
class RetrieveModelMixin():
"""用于返回get请求查询单条数据方法"""
def retrieve(self, request, id):
book_obj = self.get_queryset().filter(id=id).first()
ser_obj = self.get_serializer(book_obj)
return Response(ser_obj.data)
class UpdateModelMixin():
"""用于处理put请求发来的数据(更新数据)"""
def update(self, request, id):
book_obj = self.get_queryset().filter(id=id).first()
ser_obj = self.get_serializer(instance=book_obj, data=request.data, partial=True)
if ser_obj.is_valid():
ser_obj.save()
return Response(ser_obj.validated_data)
return Response(ser_obj.errors)
class DestroyModelMixin():
"""用于删除单条数据"""
def destroy(self, request, id):
book_obj = self.get_queryset().filter(id=id).first()
if book_obj:
book_obj.delete()
return Response('')
return Response('The deleted object does not exist.')
""" ===================== 二层封装 ===================== """
class ListCreateAPIView(GenericAPIView, ListModelMixin, CreateModelMixin):
pass
class RetrieveUpdateDestroyAPIView(GenericAPIView, RetrieveModelMixin, UpdateModelMixin, DestroyModelMixin):
pass
视图文件:
from .custom_mixin import ListCreateAPIView, RetrieveUpdateDestroyAPIView # 导入上述的APIView视图文件
from DRFView import models
from .serializers import BookSerializer # 导入自定义的序列化文件
class Book(ListCreateAPIView):
queryset = models.Book.objects.all() # 坑:这里的queryset只是放到缓存里了,再次取时还需要用.all()方法
serializer_class = BookSerializer
def get(self, request):
return self.list(request)
def post(self, request):
return self.create(request)
class BookEdit(RetrieveUpdateDestroyAPIView):
queryset = models.Book.objects.all()
serializer_class = BookSerializer
def get(self, request, id):
return self.retrieve(request, id)
def put(self, request, id):
return self.update(request, id)
def delete(self, request, id):
return self.destroy(request, id)
改进版
urls.py文件:
urlpatterns = [
url(r'^book/$', BookModel.as_view({'get': 'list', 'post': 'create'})),
url(r'^book/(?P<id>\d+)/$', BookModelView.as_view({'get': 'retrieve', 'put': 'update', 'delete': 'destroy'})),
]
"""
注意as_view的传参:
as_view({"请求方式": "调用的方法"}, {...})
指定请求方式调用的方法后,框架会为我们自动执行其方法,无需在CBV中写请求的方法了.
"""
APIView视图文件:
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework.viewsets import ViewSetMixin # 导入DRF封装好的APIView
""" ===================== 第一层封装 ===================== """
class GenericAPIView(APIView):
queryset = None
serializer_class = None
def get_queryset(self):
"""用于获取queryset的方法"""
return self.queryset.all()
def get_serializer(self, *args, **kwargs):
"""用于调用序列化类的方法"""
return self.serializer_class(*args, **kwargs)
class ListModelMixin():
"""用于返回get请求所有数据的数据"""
def list(self, request):
queryset = self.get_queryset() # self调用的方法(get_queryset)是从执行此方法(list)的当前对象的类中开始找
ser_obj = self.get_serializer(queryset, many=True) # 原理同上句话
return Response(ser_obj.data)
class CreateModelMixin():
"""用于处理post请求发来的数据"""
def create(self, request):
ser_obj = self.get_serializer(data=request.data)
if ser_obj.is_valid():
ser_obj.save()
return Response(ser_obj.validated_data)
return Response(ser_obj.errors)
class RetrieveModelMixin():
"""用于返回get请求查询单条数据方法"""
def retrieve(self, request, id):
book_obj = self.get_queryset().filter(id=id).first()
ser_obj = self.get_serializer(book_obj)
return Response(ser_obj.data)
class UpdateModelMixin():
"""用于处理put请求发来的数据(更新数据)"""
def update(self, request, id):
book_obj = self.get_queryset().filter(id=id).first()
ser_obj = self.get_serializer(instance=book_obj, data=request.data, partial=True)
if ser_obj.is_valid():
ser_obj.save()
return Response(ser_obj.validated_data)
return Response(ser_obj.errors)
class DestroyModelMixin():
"""用于删除单条数据"""
def destroy(self, request, id):
book_obj = self.get_queryset().filter(id=id).first()
if book_obj:
book_obj.delete()
return Response('')
return Response('The deleted object does not exist.')
""" ===================== 第二层封装 ===================== """
class ListCreateAPIView(GenericAPIView, ListModelMixin, CreateModelMixin):
pass
class RetrieveUpdateDestroyAPIView(GenericAPIView, RetrieveModelMixin, UpdateModelMixin, DestroyModelMixin):
pass
""" ===================== 第三层封装 ===================== """
class ModelViewSet(ViewSetMixin, ListCreateAPIView, RetrieveUpdateDestroyAPIView):
# ViewSetMixin重写了as_view方法,即可以传参了.
pass
视图文件:
from .custom_mixin import ModelViewSet # 导入上述的APIView视图文件
from DRFView import models
from .serializers import BookSerializer # 导入自定义的序列化文件
class BookModel(ModelViewSet):
queryset = models.Book.objects.all()
# 坑:这里的queryset只是放到缓存里了,再次取时还需要用.all()方法
# queryset是框架能识别的,会把数据放到缓存中,如果该成其它的名字则不会缓存(比如query),即再此取数据时不能加.all()
serializer_class = BookSerializer
class BookModelView(ModelViewSet):
queryset = models.Book.objects.all()
serializer_class = BookSerializer
接下来,我们再来看看DRF为我们封装好了的APIView用法。
开始使用内置视图
第一步 按照框架的要求写url
urlpatterns = [
url(r'^book/$', BookModel.as_view({'get': 'list', 'post': 'create'})),
# 按照APIView的要求,这里必须写为pk,而不能写id
url(r'^book/(?P<pk>\d+)/$', BookModelView.as_view({'get': 'retrieve', 'put': 'update', 'delete': 'destroy'})),
]
"""
注意as_view的传参:
as_view({"请求方式": "调用的方法"}, {...})
指定请求方式调用的方法后,无需在CBV中写请求的方法了.
"""
第二步 写视图文件
from DRFView import models
from .serializers import BookSerializer # 导入自定义的序列化文件
from rest_framework.viewsets import ModelViewSet # 导入DRF封装好的APIView class BookModel(ModelViewSet):
queryset = models.Book.objects.all()
serializer_class = BookSerializer class BookModelView(ModelViewSet):
queryset = models.Book.objects.all()
serializer_class = BookSerializer
如上步骤,我们的视图只要写两行就可以了.
关于DRF视图源码解析,推荐参考此文献:https://www.cnblogs.com/GGGG-XXXX/articles/9675911.html
继承顺序图解:

【DRF视图】的更多相关文章
- 使用DRF视图集时自定义action方法
在我们用DRF视图集完成了查找全部部门,创建一个新的部门,查找一个部门,修改一个部门,删除一个部门的功能后,views.py的代码是这样子的: class DepartmentViewSet(Mode ...
- DRF视图-请求与响应
DRF视图 drf的代码简写除了在数据序列化体现以外,在视图中也是可以的.它在django原有的django.views.View类基础上,drf内部封装了许多子类以便我们使用. Django RES ...
- DRF视图组件
DRF视图组件: CVB模式继承----五层 from django.views import View # Django的View from rest_framework.views import ...
- drf 视图使用及源码分析
前言 drf视图的源码非常的绕,但是实现的功能却非常的神奇. 它能够帮你快速的解决ORM增删改查的重复代码,非常的方便好用. 下面是它源码中的一句话: class ViewSetMixin: &quo ...
- DRF 视图组件
目录 DRF 视图组件 视图组件大纲 两个视图基本类 五个扩展类 九个子类视图 视图集 常用视图集父类 魔法类 一览表 DRF中视图的"七十二变" 第一层:基于APIview的五个 ...
- restfull规范、DRF视图和路由
一.restfull规范的简单介绍 1.介绍 REST:表述性状态转移,是一种web交互方案 资源:在web中只要有被引用的必要都是资源 URI: URI 统一资源标识符 URL 统一资源定位符 统一 ...
- drf视图组件、认证组件
视图组件 1.基本视图 url(r'^publish/$', views.PublishView.as_view()), url(r'^publish/(?P<pk>\d+)/$', vi ...
- DRF 视图和路由
Django Rest Feamework 视图和路由 DRF的视图 APIView 我们django中写CBV的时候继承的是View,rest_framework继承的是APIView,那么他们两个 ...
- DRF 视图组件,路由组件
视图组件 -- 第一次封装 -- GenericAPIView(APIView): queryset = None serializer_class = None def ge ...
随机推荐
- Python3基础笔记--装饰器
装饰器是十二分重要的高级函数. 参考博客:装饰器 所需前提知识: 1.作用域: LEGB 2.高阶函数 高阶函数是至少满足下列一个条件的函数: 1)接受一个或多个函数作为输入 2)输出一个函数 注意理 ...
- BZOJ 4373算术天才⑨与等差数列(线段树)
题意:给你一个长度为n的序列,有m个操作,写一个程序支持以下两个操作: 1. 修改一个值 2. 给出三个数l,r,k, 询问:如果把区间[l,r]的数从小到大排序,能否形成公差为k的等差数列. n,m ...
- 用C3P0建立server与数据库的连接
1:在MyEclipse建立 Web Service Project 2:在project中建立servlets包 3:在包中新建Servlet文件(採用new Servlet方法可省去配置web.x ...
- awk条件语句
条件语句用于在运行操作之前做一个測试.在前面的章节中,我们看到了模式匹配规则的一些演示样例. 模式匹配规则本质上就是影响输入循环的条件表达式. 在这一部分,我们主要就在action中所使用的条件语句进 ...
- linux下oracle11G DG搭建(三):环绕备库搭建操作
linux下oracle11G DG搭建(三):环绕备库搭建操作 环境 名称 主库 备库 主机名 bjsrv shsrv 软件版本号 RedHat Enterprise5.5.Oracle 11g 1 ...
- 我看Java二十年:它是怎样永远改变编程的。
转自jdon的小文章:来自Infoworld的一篇纪念mod=viewthread&tid=3042" target="_blank">Java诞生20周年 ...
- rman数据库恢复;关键/非重要文件、影像副本、控制文件、还原点、非归档、增量、新数据库、灾难性回复
运行全然恢复:在 ARCHIVELOG 模式下 丢失了系统重要数据文件: 假设某个数据文件丢失或损坏.且该文件属于 SYSTEM 或 UNDO 表空间,请运行下面步骤: 1. 实例可能会也可能不会自己 ...
- printf中的使用(c语言)
#include <stdio.h> int main(int argc, const char * argv[]) { //整形输出 printf("%d,%d",3 ...
- CSS元素选择器 element selector(type selector)
http://www.w3school.com.cn/css/css_selector_type.asp 元素选择器 最常见的 CSS 选择器是元素选择器.换句话说,文档的元素就是最基本的选择器. 如 ...
- 圈复杂度(Cyclomatic Complexity)
圈复杂度(Cyclomatic Complexity)是很常用的一种度量软件代码复杂程度的标准.这里所指的“代码复杂程度”并非软件内在业务逻辑的复杂程度,而是指代码的实现方式的 复杂程度.说起来有点绕 ...