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实现一个简单的银行转账操作
Mar 06 Python
Python的Twisted框架上手前所必须了解的异步编程思想
May 25 Python
Python随机生成手机号、数字的方法详解
Jul 21 Python
解决Python 命令行执行脚本时,提示导入的包找不到的问题
Jan 19 Python
python实现贪吃蛇小游戏
Mar 21 Python
详解利用Python scipy.signal.filtfilt() 实现信号滤波
Jun 05 Python
Python re正则表达式元字符分组()用法分享
Feb 10 Python
Python3 pickle对象串行化代码实例解析
Mar 23 Python
浅谈python 中的 type(), dtype(), astype()的区别
Apr 09 Python
python print 格式化输出,动态指定长度的实现
Apr 12 Python
Pandas对DataFrame单列/多列进行运算(map, apply, transform, agg)
Jun 14 Python
Python面向对象之成员相关知识总结
Jun 24 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
上海地方志办公室-上海电子仪表工业志
2021/03/04 无线电
CI框架源码阅读,系统常量文件constants.php的配置
2013/02/28 PHP
PHP从尾到头打印链表实例讲解
2018/09/27 PHP
jquery 表格分页等操作实现代码(pagedown,pageup)
2010/04/11 Javascript
一个简单的动态加载js和css的jquery代码
2014/09/01 Javascript
angular简介和其特点介绍
2015/01/29 Javascript
js时间戳转为日期格式的方法
2015/12/28 Javascript
基于jquery实现三级下拉菜单
2016/05/10 Javascript
js实现页面a向页面b传参的方法
2016/05/29 Javascript
全面解析JavaScript中的valueOf与toString方法(推荐)
2016/06/14 Javascript
微信小程序教程之本地图片上传(leancloud)实例详解
2016/11/16 Javascript
原生js实现轮播图的示例代码
2017/02/20 Javascript
AngularJS使用ui-route实现多层嵌套路由的示例
2018/01/10 Javascript
vue的安装及element组件的安装方法
2018/03/09 Javascript
Vue实现小购物车功能
2020/12/21 Vue.js
vue watch监控对象的简单方法示例
2021/01/07 Vue.js
[07:38]2014DOTA2国际邀请赛 Newbee顺利挺进胜者组赛后专访
2014/07/15 DOTA
python遍历 truple list dictionary的几种方法总结
2016/09/11 Python
Python爬虫获取图片并下载保存至本地的实例
2018/06/01 Python
为什么str(float)在Python 3中比Python 2返回更多的数字
2018/10/16 Python
使用python将图片按标签分入不同文件夹的方法
2018/12/08 Python
Python数据集切分实例
2018/12/08 Python
Python实现计算字符串中出现次数最多的字符示例
2019/01/21 Python
解决Atom安装Hydrogen无法运行python3的问题
2019/08/28 Python
django ListView的使用 ListView中获取url中的参数值方式
2020/03/27 Python
python交互模式基础知识点学习
2020/06/18 Python
selenium+超级鹰实现模拟登录12306
2021/01/24 Python
canvas离屏技术与放大镜实现代码示例
2018/08/31 HTML / CSS
Perfume’s Club英国官网:购买香水和护肤品
2019/11/02 全球购物
幼儿教师个人求职信范文
2013/09/21 职场文书
乡镇网格化管理实施方案
2014/03/23 职场文书
汽修专业自荐信
2014/07/07 职场文书
2015年仓库工作总结
2015/04/09 职场文书
可怜妈妈观后感
2015/06/09 职场文书
青涩记忆观后感
2015/06/18 职场文书
将图片保存到mysql数据库并展示在前端页面的实现代码
2021/05/02 MySQL