请结合【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视图】的更多相关文章

  1. 使用DRF视图集时自定义action方法

    在我们用DRF视图集完成了查找全部部门,创建一个新的部门,查找一个部门,修改一个部门,删除一个部门的功能后,views.py的代码是这样子的: class DepartmentViewSet(Mode ...

  2. DRF视图-请求与响应

    DRF视图 drf的代码简写除了在数据序列化体现以外,在视图中也是可以的.它在django原有的django.views.View类基础上,drf内部封装了许多子类以便我们使用. Django RES ...

  3. DRF视图组件

    DRF视图组件: CVB模式继承----五层 from django.views import View # Django的View from rest_framework.views import ...

  4. drf 视图使用及源码分析

    前言 drf视图的源码非常的绕,但是实现的功能却非常的神奇. 它能够帮你快速的解决ORM增删改查的重复代码,非常的方便好用. 下面是它源码中的一句话: class ViewSetMixin: &quo ...

  5. DRF 视图组件

    目录 DRF 视图组件 视图组件大纲 两个视图基本类 五个扩展类 九个子类视图 视图集 常用视图集父类 魔法类 一览表 DRF中视图的"七十二变" 第一层:基于APIview的五个 ...

  6. restfull规范、DRF视图和路由

    一.restfull规范的简单介绍 1.介绍 REST:表述性状态转移,是一种web交互方案 资源:在web中只要有被引用的必要都是资源 URI: URI 统一资源标识符 URL 统一资源定位符 统一 ...

  7. drf视图组件、认证组件

    视图组件 1.基本视图 url(r'^publish/$', views.PublishView.as_view()), url(r'^publish/(?P<pk>\d+)/$', vi ...

  8. DRF 视图和路由

    Django Rest Feamework 视图和路由 DRF的视图 APIView 我们django中写CBV的时候继承的是View,rest_framework继承的是APIView,那么他们两个 ...

  9. DRF 视图组件,路由组件

    视图组件  -- 第一次封装   -- GenericAPIView(APIView):    queryset = None    serializer_class = None    def ge ...

随机推荐

  1. WLAN STA/AP 并发

    WLAN STA/AP 并发 Android 9 引入了可让设备同时在 STA 和 AP 模式下运行的功能.对于支持双频并发 (DBS) 的设备,此功能让一些新功能得以实现,例如在用户想要启用热点 ( ...

  2. linux系统下,11款常见远程桌面控制软件(转载)

    远程控制能够给人们带来很多便利,本文介绍了11款常见的Linux系统下的远程桌面控制工具,总有一款能适合您. 一. Grdc 它是一个用GTK+编写的,适用于gnome桌面环境的远程桌面访问软件.看图 ...

  3. PHPSTORM+Xdebug断点调试代码

    如果没有安装 PHPSTORM 可以参考 phpstorm10安装并汉化 一.下载 XDEBUG 下载地址:https://xdebug.org/download.php 二.如何快速寻找适合自己PH ...

  4. NodeJS学习笔记 进阶 (8)express+morgan实现日志记录(ok)

    个人总结:这篇文章讲解了Express框架中日志记录插件morgan的示例.读完这篇文章需要10分钟 摘选自网络 章节概览 morgan是express默认的日志中间件,也可以脱离express,作为 ...

  5. 紫书 例题 10-10 UVa 10491(概率计算)

    公式很好推,表示被高中生物遗传概率计算虐过的人 这个公式简直不需要动脑 #include<cstdio> using namespace std; int main() { double ...

  6. *Mapper.xml文件头

    <?xml version="1.0" encoding="UTF-8"?><!DOCTYPE mapper PUBLIC "-// ...

  7. 【Henu ACM Round#20 B】Contest

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 根据时间和原分数. 算出对应的分数就可以了. [代码] #include <bits/stdc++.h> using n ...

  8. 三种记录 MySQL 所执行过的 SQL 语句的方法

    程式 Debug 有時後從前面第一行追起來很辛苦(程式碼太多或 compile 過), 另一種做法就是從後面追起來, 反正最後寫入的是 DB, 那就從 DB 開始往前推, 所以就是要抓程式是執行哪些 ...

  9. Jsoncpp使用具体解释以及链接问题解决

    JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式. 易于人阅读和编写. 同一时候也易于机器解析和生成. 它基于JavaScript Programming ...

  10. iPad popView封装

    仿照UITableView的UITableViewDataSource 协义 1.代理.让代理帮我们类完毕一些方法 2.完毕当前类不能完毕的事情还有传值等功能 实现方法 // 1. 声明一个协议 // ...