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实现进程间通信简单实例
Jul 23 Python
详解Python中expandtabs()方法的使用
May 18 Python
浅谈python中截取字符函数strip,lstrip,rstrip
Jul 17 Python
Python中的getopt函数使用详解
Jul 28 Python
Android应用开发中Action bar编写的入门教程
Feb 26 Python
Django restframework 源码分析之认证详解
Feb 22 Python
多版本python的pip 升级后, pip2 pip3 与python版本失配解决方法
Sep 11 Python
opencv3/C++图像像素操作详解
Dec 10 Python
python 字段拆分详解
Dec 17 Python
python 中值滤波,椒盐去噪,图片增强实例
Dec 18 Python
Python爬虫基于lxml解决数据编码乱码问题
Jul 31 Python
Python字符串三种格式化输出
Sep 17 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
php操作memcache缓存方法分享
2015/06/03 PHP
php curl抓取网页的介绍和推广及使用CURL抓取淘宝页面集成方法
2015/11/30 PHP
php代码调试利器firephp安装与使用方法分析
2018/08/21 PHP
JavaScript 高级篇之函数 (四)
2012/04/07 Javascript
纯javascript实现的小游戏《Flappy Pig》实例
2015/07/27 Javascript
基于Jquery和html5的7款个性化地图插件
2015/11/17 Javascript
jQuery实现获取绑定自定义事件元素的方法
2015/12/02 Javascript
canvas学习之API整理笔记(一)
2016/12/29 Javascript
深入理解JavaScript中的for循环
2017/02/07 Javascript
angular4笔记系列之内置指令小结
2018/11/09 Javascript
发布订阅模式在vue中的实际运用实例详解
2019/06/09 Javascript
js实现上传图片并显示图片名称
2019/12/18 Javascript
vue.js中使用微信扫一扫解决invalid signature问题(完美解决)
2020/04/11 Javascript
Python时间戳与时间字符串互相转换实例代码
2013/11/28 Python
python实现的系统实用log类实例
2015/06/30 Python
老生常谈Python进阶之装饰器
2017/05/11 Python
利用python将图片版PDF转文字版PDF
2019/05/03 Python
numpy.random.shuffle打乱顺序函数的实现
2019/09/10 Python
python paramiko远程服务器终端操作过程解析
2019/12/14 Python
Django中的session用法详解
2020/03/09 Python
Python基于模块Paramiko实现SSHv2协议
2020/04/28 Python
selenium设置浏览器为headless无头模式(Chrome和Firefox)
2021/01/08 Python
迪拜领先运动补剂零售品牌中文站:Sporter商城
2019/08/20 全球购物
德国滑雪和户外用品网上商店:XSPO
2019/10/30 全球购物
个人实用的自我评价范文
2013/11/23 职场文书
会计电算化专业毕业生求职信范文
2013/12/10 职场文书
护理职业生涯规划书
2014/01/24 职场文书
善意的谎言事例
2014/02/15 职场文书
浪费资源的建议书
2014/03/12 职场文书
学校读书活动总结
2014/06/30 职场文书
明确岗位职责
2015/02/14 职场文书
欠款纠纷起诉状
2015/05/19 职场文书
机器人总动员观后感
2015/06/09 职场文书
终止解除劳动合同证明书
2015/06/17 职场文书
在js中修改html body的样式
2021/11/11 Javascript
python playwright之元素定位示例详解
2022/07/23 Python