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多线程threading.Lock锁用法实例
Nov 01 Python
Python配置文件解析模块ConfigParser使用实例
Apr 13 Python
Python工程师面试题 与Python Web相关
Jan 14 Python
教大家使用Python SqlAlchemy
Feb 12 Python
Python正则表达式使用范例分享
Dec 04 Python
Python基于列表模拟堆栈和队列功能示例
Jan 05 Python
Python中循环后使用list.append()数据被覆盖问题的解决
Jul 01 Python
Python远程开发环境部署与调试过程图解
Dec 09 Python
pytorch torchvision.ImageFolder的用法介绍
Feb 20 Python
python实现拼接图片
Mar 23 Python
详解Python小数据池和代码块缓存机制
Apr 07 Python
Python Matplotlib绘制两个Y轴图像
Apr 13 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 strtotime函数详解
2009/12/18 PHP
php+ajax制作无刷新留言板
2015/10/27 PHP
解决form中action属性后面?传递参数 获取不到的问题
2017/07/21 PHP
Yii2 queue的队列使用详解
2019/07/19 PHP
jQuery 可以拖动的div实现代码 脚本之家修正版
2009/06/26 Javascript
面向对象的javascript(笔记)
2009/10/06 Javascript
JavaScript 继承机制的实现(待续)
2010/05/18 Javascript
JavaScript函数定义的常见注意事项小结
2014/09/16 Javascript
jQuery中:first选择器用法实例
2014/12/30 Javascript
JavaScript小技巧整理
2015/12/30 Javascript
基于BootStrap的Metronic框架实现页面链接收藏夹功能按钮移动收藏记录(使用Sortable进行拖动排序)
2016/08/29 Javascript
AngularJS  自定义指令详解及实例代码
2016/09/14 Javascript
Three.js的使用及绘制基础3D图形详解
2017/04/27 Javascript
jQuery 循环遍历改变a标签的href(实例讲解)
2017/07/12 jQuery
微信小程序之电影影评小程序制作代码
2017/08/03 Javascript
vue脚手架搭建过程图解
2018/06/06 Javascript
在vue项目中集成graphql(vue-ApolloClient)
2018/09/08 Javascript
JavaScript判断浏览器版本的方法
2019/11/03 Javascript
vue开发中遇到的问题总结
2020/04/07 Javascript
Vue实现鼠标经过文字显示悬浮框效果的示例代码
2020/10/14 Javascript
python的else子句使用指南
2016/02/27 Python
mac下如何将python2.7改为python3
2018/07/13 Python
一看就懂得Python的math模块
2018/10/21 Python
详解Python下载图片并保存本地的两种方式
2019/05/15 Python
Linux下通过python获取本机ip方法示例
2019/09/06 Python
sklearn-SVC实现与类参数详解
2019/12/10 Python
PyTorch中Tensor的数据类型和运算的使用
2020/09/03 Python
HTML5打开手机扫码功能及优缺点
2017/11/27 HTML / CSS
《学会合作》教学反思
2014/04/12 职场文书
优秀毕业生的求职信
2014/07/21 职场文书
四川省传达学习贯彻党的群众路线教育实践活动总结大会精神新闻稿
2014/10/26 职场文书
团支部组织委员竞选稿
2015/11/21 职场文书
CSS3实现的水平标题菜单
2021/04/14 HTML / CSS
HTML5中 rem适配方案与 viewport 适配问题详解
2021/04/27 HTML / CSS
Vue全家桶入门基础教程
2021/05/14 Vue.js
Python函数中的不定长参数相关知识总结
2021/06/24 Python