Django框架之DRF 基于mixins来封装的视图详解


Posted in Python onJuly 23, 2019

基础视图

示例环境搭建:新建一个Django项目,连接Mysql数据库,配置路由、视图函数、序列化单独创建py文件

# 配置路由

from django.conf.urls import url
from django.contrib import admin
from app01 import views

urlpatterns = [
 url(r'^admin/', admin.site.urls),
 url(r'^PublishView/', views.PublishView.as_view()),
 url(r'^PublishDetailView/(?P<pk>\d+)', views.PublishDetailView.as_view()),

]
# 视图:

from django.shortcuts import render
from rest_framework.views import APIView
from app01 import models
from app01.MySer import BookSer,PublishSer,AuthorSer
from rest_framework.response import Response
# Create your views here.
# 基本视图

class PublishView(APIView):

 def get(self,request):
  publish_list = models.Publish.objects.all()
  bs = PublishSer(publish_list, many=True)
  return Response(bs.data)

 def post(self, request):
  bs = PublishSer(data=request.data)
  if bs.is_valid():
   bs.save()
   return Response(bs.data)
  else:
   return Response(bs.errors)

class PublishDetailView(APIView):
 def get(self, request, pk):
  publish_obj = models.Publish.objects.filter(pk=pk).first()
  bs = PublishSer(publish_obj, many=False)
  return Response(bs.data)

 def put(self, request, pk):
  publish_obj = models.Publish.objects.filter(pk=pk).first()
  bs = PublishSer(data=request.data, instance=publish_obj)
  if bs.is_valid():
   bs.save()
   return Response(bs.data)
  else:
   return Response(bs.data)

 def delete(self, request, pk):
  models.Publish.objects.filter(pk=pk).delete()
  return Response("")
# MySer.py

from rest_framework import serializers
from app01 import models

class BookSer(serializers.ModelSerializer):
 class Meta:
  model = models.Book
  fields = '__all__'


class PublishSer(serializers.ModelSerializer):
 class Meta:
  model = models.Publish
  fields = '__all__'


class AuthorSer(serializers.ModelSerializer):
 class Meta:
  model = models.Author
  fields = '__all__'

基于mixins来封装的视图

其它不变,更改视图:

# 基于mixins来封装的视图
from rest_framework.mixins import CreateModelMixin,\
         ListModelMixin,\
         RetrieveModelMixin,\
         DestroyModelMixin,\
         UpdateModelMixin
from rest_framework.generics import GenericAPIView

class PublishView(CreateModelMixin, ListModelMixin, GenericAPIView):
 queryset = models.Publish.objects.all()
 serializer_class = PublishSer
 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 PublishDetailView(RetrieveModelMixin, UpdateModelMixin, DestroyModelMixin, GenericAPIView):
 queryset = models.Publish.objects.all()
 serializer_class = PublishSer
 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 delete(self, request, *args, **kwargs):
  return self.destroy(request, *args, **kwargs)

可以看出视图类中还是有很多冗余代码

mixins封装再封装,第三种方法

# 第三种写法:
from rest_framework.generics import CreateAPIView,\
         ListCreateAPIView,\
         DestroyAPIView,\
         RetrieveUpdateDestroyAPIView

class PublishView(ListCreateAPIView):
 queryset = models.Publish.objects.all()
 serializer_class = PublishSer

class PublishDetailView(RetrieveUpdateDestroyAPIView):
 queryset = models.Publish.objects.all()
 serializer_class = PublishSer

还是有冗余代码

第四种写法,再次封装,全部写在一个类中

# 路由
from django.conf.urls import url
from django.contrib import admin
from app01 import views

urlpatterns = [
 url(r'^admin/', admin.site.urls),

 url(r'^publish/$', views.PublishView.as_view({'get': 'list', 'post': 'create'})),
 url(r'^publish/(?P<pk>\d+)$', views.PublishView.as_view({'get': 'retrieve', 'put': 'update', 'delete': 'destroy'})),

]
# 第四种写法:5个接口写在一个类中
from rest_framework.viewsets import ModelViewSet
class PublishView(ModelViewSet):
 queryset = models.Publish.objects.all()
 serializer_class = PublishSer

补充:

from rest_framework.viewsets import ViewSetMixin
from rest_framework.views import APIView
# ViewSetMixin 重写了as_view方法
class Test(ViewSetMixin,APIView):

 def aaa(self,request):
  return Response()

以上这篇Django框架之DRF 基于mixins来封装的视图详解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python 遍历子文件和所有子文件夹的代码实例
Dec 21 Python
python 专题九 Mysql数据库编程基础知识
Mar 16 Python
tensorflow获取变量维度信息
Mar 10 Python
Python实现的简单读写csv文件操作示例
Jul 12 Python
Python实现数据可视化看如何监控你的爬虫状态【推荐】
Aug 10 Python
Python在图片中插入大量文字并且自动换行
Jan 02 Python
Python多版本开发环境管理工具介绍
Jul 03 Python
使用Python实现文字转语音并生成wav文件的例子
Aug 08 Python
python elasticsearch环境搭建详解
Sep 02 Python
Django 请求Request的具体使用方法
Nov 11 Python
python 爬虫网页登陆的简单实现
Nov 30 Python
matplotlib之pyplot模块之标题(title()和suptitle())
Feb 22 Python
flask框架路由常用定义方式总结
Jul 23 #Python
python处理大日志文件
Jul 23 #Python
Django urls.py重构及参数传递详解
Jul 23 #Python
Django框架基础模板标签与filter使用方法详解
Jul 23 #Python
Python之虚拟环境virtualenv,pipreqs生成项目依赖第三方包的方法
Jul 23 #Python
Python中拆分字符串的操作方法
Jul 23 #Python
python实现电子书翻页小程序
Jul 23 #Python
You might like
第十三节 对象串行化 [13]
2006/10/09 PHP
关于文本留言本的分页代码
2006/10/09 PHP
在windows iis5下安装php4.0+mysql之我见
2006/10/09 PHP
php的curl实现get和post的代码
2008/08/23 PHP
PHP数据类型之布尔型的介绍
2013/04/28 PHP
如何使用php输出时间格式
2013/08/31 PHP
PHP中判断变量为空的几种方法小结
2013/11/12 PHP
PH P5.2至5.5、5.6的新增功能详解
2014/07/14 PHP
PHP大转盘中奖概率算法实例
2014/10/21 PHP
php成功操作redis cluster集群的实例教程
2019/01/13 PHP
laravel 配置路由 api和web定义的路由的区别详解
2019/09/03 PHP
javascript复制粘贴与clipboardData的使用
2014/10/16 Javascript
使用jQuery实现返回顶部
2015/01/26 Javascript
JS给超链接加确认对话框的方法
2015/02/24 Javascript
javascript实现相同事件名称,不同命名空间的调用方法
2015/06/26 Javascript
javascript图片预加载完整实例
2015/12/10 Javascript
Angularjs中UI Router全攻略
2016/01/29 Javascript
详解js实现线段交点的三种算法
2016/08/09 Javascript
Angularjs CURD 详解及实例代码
2016/09/14 Javascript
AngularJS表格样式简单设置方法示例
2017/03/03 Javascript
socket.io实现在线群聊功能
2017/04/07 Javascript
总结JavaScript在IE9之前版本中内存泄露问题
2018/04/28 Javascript
vuex 动态注册方法 registerModule的实现
2019/07/03 Javascript
javascript自定义右键菜单插件
2019/12/16 Javascript
JavaScript隐式类型转换代码实例
2020/05/29 Javascript
浅谈python中的实例方法、类方法和静态方法
2017/02/17 Python
python中使用xlrd读excel使用xlwt写excel的实例代码
2018/01/31 Python
python opencv实现图像边缘检测
2019/04/29 Python
python读csv文件时指定行为表头或无表头的方法
2019/06/26 Python
Selenium启动Chrome时配置选项详解
2020/03/18 Python
加拿大当代时尚服饰、配饰和鞋类专业零售商和制造商:LE CHÂTEAU
2017/10/06 全球购物
环保志愿者活动总结
2014/06/27 职场文书
2014年九一八事变演讲稿
2014/09/14 职场文书
2016自主招生校长推荐信范文
2015/03/23 职场文书
少先队大队委竞选口号
2015/12/25 职场文书
MYSQL 表的全面总结
2021/11/11 MySQL