基于mixins视图类

from rest_framework import mixins

# 创建视图
class CreateModelMixin(object)
def create(self, request, *args, **kwargs): # 查看所有视图
class ListModelMixin(object)
def list(self, request, *args, **kwargs): # 查看单个视图
class RetrieveModelMixin(object)
def retrieve(self, request, *args, **kwargs): # 更新视图
class UpdateModelMixin(object)
def update(self, request, *args, **kwargs): # 删除视图
class DestroyModelMixin(object)
def destroy(self, request, *args, **kwargs):

基于generics视图类

from rest_framework import generics

class GenericAPIView(views.APIView):
# 获取 queryset 和 serializer_class # POST请求创建数据
class CreateAPIView(mixins.CreateModelMixin,GenericAPIView):
def post(self, request, *args, **kwargs): # GET请求查询所有数据
class ListAPIView(mixins.ListModelMixin,GenericAPIView):
def get(self, request, *args, **kwargs): # GET请求查询单条数据
class RetrieveAPIView(mixins.RetrieveModelMixin,GenericAPIView):
def get(self, request, *args, **kwargs): # DELETE请求删除数据
class DestroyAPIView(mixins.DestroyModelMixin,GenericAPIView):
def delete(self, request, *args, **kwargs): # PUT/PATCH请求更新数据
class UpdateAPIView(mixins.UpdateModelMixin,GenericAPIView):
def put(self, request, *args, **kwargs):
def patch(self, request, *args, **kwargs):

基于generics视图类(组合版)

# 新增/查询所有数据的视图类
class ListCreateAPIView(mixins.ListModelMixin,
mixins.CreateModelMixin,
GenericAPIView): def get(self, request, *args, **kwargs):
return self.list(request, *args, **kwargs) def post(self, request, *args, **kwargs):
return self.create(request, *args, **kwargs) # 更新数据/单条数据查询的视图类
class RetrieveUpdateAPIView(mixins.RetrieveModelMixin,
mixins.UpdateModelMixin,
GenericAPIView): def get(self, request, *args, **kwargs):
return self.retrieve(request, *args, **kwargs) def put(self, request, *args, **kwargs):
return self.update(request, *args, **kwargs) def patch(self, request, *args, **kwargs):
return self.partial_update(request, *args, **kwargs) # 删除数据/单条数据查询的视图类
class RetrieveDestroyAPIView(mixins.RetrieveModelMixin,
mixins.DestroyModelMixin,
GenericAPIView): def get(self, request, *args, **kwargs):
return self.retrieve(request, *args, **kwargs) def delete(self, request, *args, **kwargs):
return self.destroy(request, *args, **kwargs) # 删除数据/更新数据/单条数据查询的视图类
class RetrieveUpdateDestroyAPIView(mixins.RetrieveModelMixin,
mixins.UpdateModelMixin,
mixins.DestroyModelMixin,
GenericAPIView): def get(self, request, *args, **kwargs):
return self.retrieve(request, *args, **kwargs) def put(self, request, *args, **kwargs):
return self.update(request, *args, **kwargs) def patch(self, request, *args, **kwargs):
return self.partial_update(request, *args, **kwargs) def delete(self, request, *args, **kwargs):
return self.destroy(request, *args, **kwargs)

基于两个路由和两个视图类的接口

# URL路由
url(r'^book_list/$',BookView.as_view()),
url(r'^book_list/(?P<pk>\d+)/$',EditBookView.as_view()),
'''
基于DRF框架的generics视图类
''' from rest_framework import generics
from .models import Book
from utils.model_serializers import BookSerializer # 查询所有/新增,不带参数
class BookView(generics.ListCreateAPIView):
queryset = Book.objects.all()
serializer_class = BookSerializer # 查询/更新/删除单条数据,带参数
class EditBookView(generics.RetrieveUpdateDestroyAPIView):
queryset = Book.objects.all()
serializer_class = BookSerializer

viewsets.ModelViewSet类

class GenericViewSet(ViewSetMixin, generics.GenericAPIView):

class ModelViewSet(mixins.CreateModelMixin,
mixins.RetrieveModelMixin,
mixins.UpdateModelMixin,
mixins.DestroyModelMixin,
mixins.ListModelMixin,
GenericViewSet):

基于两个路由和一个视图类的接口

# 继承ViewSetMixin的视图类的url才能传参,参数必须是pk
url(r'book_list/$',BookView.as_view({'get':'list','post':'create'})),
url(r'book_list/(?P<pk>\d+)/$',BookView.as_view({'get':'retrieve','put':'update','delete':'destroy'}))
from .models import Book
from utils.model_serializers import BookSerializer
from rest_framework import viewsets # viewsets.ModelViewSet 封装了5个方法
class BookView(viewsets.ModelViewSet):
queryset = Book.objects.all()
serializer_class = BookSerializer

DRF框架自带视图组件的图解

源码流程

# 3、处理后:
url(r'^authors/$',ViewSetMixin.view) def as_view(cls, actions=None, **initkwargs):
view.actions = actions def view(request, *args, **kwargs):
pass return csrf_exempt(view) # 4、用户请求url,调用view函数,传入字典
def view(request, *args, **kwargs):
self = cls(**initkwargs)
self.action_map = actions
for method, action in actions.items(): {"get":"list", "post":"create"}
handler = getattr(self, action) # self.list, self.create
setattr(self, method, handler) # self.get = self.list, self.post = self.create # getattr(self,"get") # self.list
# getattr(self,"post") # self.create return self.dispatch(request, *args, **kwargs) # 5、在AuthorModelView的父类中查出并调用dispatch方法,
class APIView(View):
def dispatch(self, request, *args, **kwargs):
# get = list. post = create
if request.method.lower() in self.http_method_names: # get
handler = getattr(self, request.method.lower(), self.http_method_not_allowed) # list response = handler(request, *args, **kwargs) return self.response # self.list

【DRF框架】视图组件的更多相关文章

  1. 第三章、drf框架 - 序列化组件 | Serializer

    目录 第三章.drf框架 - 序列化组件 | Serializer 序列化组件 知识点:Serializer(偏底层).ModelSerializer(重点).ListModelSerializer( ...

  2. DRF的视图组件

    目录 DRF的视图组件 两大视图类 六大视图工具类 九大工具视图类 两大视图集基类 DRF的视图组件 DRF的视图组件大概分以下几类 两大视图类 APIView.GenericAPIView from ...

  3. drf框架 - 过滤组件 | 分页组件 | 过滤器插件

    drf框架 接口过滤条件 群查接口各种筛选组件数据准备 models.py class Car(models.Model): name = models.CharField(max_length=16 ...

  4. drf框架 - 序列化组件 | ModelSerializer (查,增,删,改)

    ModelSerializer 序列化准备: 配置 settings.py # 注册rest_framework框架 INSTALLED_APPS = [ ... 'rest_framework' ] ...

  5. DRF之视图组件

    不断的优化我们写的程序,是每个程序员必备的技能和职业素养,也是帮助我们成长的非常重要的手段. 使用serializer进行put接口设计 根据规范,PUT接口用来定义用户对数据修改的逻辑,也就是upd ...

  6. drf框架 - 视图家族 | GenericAPIView | mixins | generics | viewsets

    视图家族 view:视图 generics:工具视图 mixins:视图工具集 viewsets:视图集 学习曲线: APIView => GenericAPIView => mixins ...

  7. drf框架 - 序列化组件 | Serializer

    序列化组件 知识点:Serializer(偏底层).ModelSerializer(重点).ListModelSerializer(辅助群改) 序列化与反序列化 序列化: 将对象序列化成字符串用户传输 ...

  8. Django中的DRF框架视图集使用

    1. 两个基类 1)APIView Django REST_framework 中所有视图的基类是APIView   父类是View 支持定义的属性: authentication_classes 列 ...

  9. DRF之视图组件 三次封装

    1.为什么要进行封装 1.1 在处理表的时候,如果有几十张表都需要增删改查查时,如果每一张表都写这些方法,会让代码显得冗余,所以需要将这些方法进行封装,然后不同的表都去继承这写方法.(这是思路) 1. ...

  10. DRF(5) - 频率组件、url注册器、响应器、分页器

    一.频率组件 1.使用DRF简单频率控制实现对用户进行访问频率控制 1)导入模块,定义频率类并继承SimpleRateThrottle # 导入模块 from rest_framework.throt ...

随机推荐

  1. Sqoop2 将hdfs中的数据导出到MySQL

    1.进入sqoop2终端: [root@master /]# sqoop2 2.为客户端配置服务器: sqoop:000> set server --host master --port 120 ...

  2. Java Sound : audio inputstream from pcm amplitude array

    转载自:http://ganeshtiwaridotcomdotnp.blogspot.com/2011/12/java-sound-making-audio-input-stream.html In ...

  3. Python - Django - ORM 分组查询补充

    单表查询: models.py: from django.db import models class Employee(models.Model): name = models.CharField( ...

  4. mysql日期加一个天数获得新的日期

    原文地址:https://476057266-qq-com.iteye.com/blog/2047671 在当前的日期上加三天,天数随便改: SELECT date_add(CURRENT_DATE( ...

  5. OneNote中更改英文输入默认不是微软雅黑的问题

    win10下的终极版解决方案: 1.进入C:\Windows\Fonts找到Calibri字体,点进去后先右键Calibri常规-属性-安全-高级,将所有者从“TrustedInstaller”更改为 ...

  6. 与TypeScript的一场美丽邂逅

    TypeScript(一)前言:当你点开这篇文章时,我相信你已经在很多地方都已经听说过或者见过TypeScript了.但是可能对TypeScript依然有很多问号:TypeScript到底是什么?为什 ...

  7. Linux(Ubuntu)下的OpenGl的环境安装, 在qt程序中使用opengl库

    OpenGl的环境安装 以下参考自:https://blog.csdn.net/wasaiheihei/article/details/52085397 1. 建立基本编译环境 首先不可或缺的,就是编 ...

  8. Valgrind工具------可以分析内存泄漏

    Valgrind 是个开源的工具,功能很多.例如检查内存泄漏工具---memcheck. 安装: 1)官网下载:http://www.valgrind.org/downloads/ , 下载tar.b ...

  9. SecureCRT系列:生成公私钥

    SecureCRT下载地址:http://www.portablesoft.org/securecrt-securefx-legacy-versions/1.打开我们的SecureCRT客户端,点击t ...

  10. 字符串char vchar性能对比补充

    Value CHAR(4) Storage Required VARCHAR(4) Storage Required '' '    ' 4 bytes '' 1 byte 'ab' 'ab  ' 4 ...