基于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. 【kubernetes secret 和 aws ecr helper】kubernetes从docker拉取image,kubernetes docker私服认证(argo docker私服认证),no basic auth credentials错误解决

    aws ecr helper: https://aws.amazon.com/blogs/compute/authenticating-amazon-ecr-repositories-for-dock ...

  2. 【C/C++开发】C中调用C++函数

    C中如何调用C++函数? 前阵子被问及一个在C中如何调用C++函数的问题,当时简单回答是将函数用extern "C"声明,当被问及如何将类内成员函数声明时,一时语塞,后来网上查了下 ...

  3. QPS、TPS和系统吞吐量

    QPS:Queries Per Second,每秒查询率.是一台服务器每秒能够相应的查询次数,是对一个特定的查询服务器在规定时间内所处理流量多少的衡量标准. TPS:Transactions Per ...

  4. 自己实现CountDownLatch

    自己实现的CountDownLatch ,只是模拟他的功能而已.jdk中的实现采用的是AQS public class MyCountDownLatch { private final int tot ...

  5. [.Net Core] - 当 .Net Core 版本由 1.x 升级至 2.x 后,Cookie 使用方式变更

    背景 Asp.Net Core 项目升级至 2.x 版本后,Cookie 验证方式需要进行更新. 升级前:.Net Core 1.x Startup.cs public void Configure( ...

  6. 图像处理库 Pillow与PIL

    PIL只支持python2的版本到2.7: Python imaging Library : Pillow 是PIL派生的一个分支,支持3以上Python版本. 命令使用pip安装: pip inst ...

  7. 利用strace & Perf分析MySQL

    strace介绍及用途 strace是一个用于诊断,分析linux用户态进程的工具 类似的工具pstrace,lsof,gdb,pstrack strace观察mysqld对my.cnf 配置文件的加 ...

  8. vagrant root 登录虚拟机

    这个问题本来觉得是个特别简单的问题,昨天弄的时候折腾了半晚上.所以打算记录下过程,主要也被网上的各种信息误导了. 1 先看下我这vagrant配置信息 Vagrant.configure(" ...

  9. Android--自定义Dialog style

    <style name="dialog" parent="@android:style/Theme.Dialog"> <item name=& ...

  10. 从ftp获取文件并生成压缩包

    依赖 <dependency> <groupId>commons-net</groupId> <artifactId>commons-net</a ...