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教程之用py2exe将PY文件转成EXE文件
Jun 12 Python
Python中关键字is与==的区别简述
Jul 31 Python
一个月入门Python爬虫学习,轻松爬取大规模数据
Jan 03 Python
python中将一个全部为int的list 转化为str的list方法
Apr 09 Python
浅谈python requests 的put, post 请求参数的问题
Jan 02 Python
六行python代码的爱心曲线详解
May 17 Python
使用Python实现将list中的每一项的首字母大写
Jun 11 Python
python搜索包的路径的实现方法
Jul 19 Python
Python3使用xml.dom.minidom和xml.etree模块儿解析xml文件封装函数的方法
Sep 23 Python
django执行数据库查询之后实现返回的结果集转json
Mar 31 Python
python 如何利用argparse解析命令行参数
Sep 11 Python
matplotlib如何设置坐标轴刻度的个数及标签的方法总结
Jun 11 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+AJAX聊天程序[聊天室]提供下载
2007/07/21 PHP
redis 队列操作的例子(php)
2012/04/12 PHP
smarty自定义函数htmlcheckboxes用法实例
2015/01/22 PHP
在PHP语言中使用JSON和将json还原成数组的方法
2016/07/19 PHP
PHP通过文件路径获取文件名的实例代码
2018/10/14 PHP
laravel框架创建授权策略实例分析
2019/11/22 PHP
php使用Swoole实现毫秒级定时任务的方法
2020/09/04 PHP
BOOM vs RR BO3 第一场2.13
2021/03/10 DOTA
Javascript的一种模块模式
2008/03/22 Javascript
Javascript在IE或Firefox下获取鼠标位置的代码
2009/12/18 Javascript
基于jquery的兼容各种浏览器的iframe自适应高度的脚本
2010/08/13 Javascript
JavaScript 程序编码规范
2010/11/23 Javascript
使用jQueryMobile实现滑动翻页效果的方法
2015/02/04 Javascript
vue.js指令和组件详细介绍及实例
2017/04/06 Javascript
Vue动态组件与异步组件实例详解
2019/02/23 Javascript
vue改变对象或数组时的刷新机制的方法总结
2019/04/24 Javascript
原生JS实现烟花效果
2020/03/10 Javascript
vue 如何使用递归组件
2020/10/23 Javascript
python计算最大优先级队列实例
2013/12/18 Python
以Python的Pyspider为例剖析搜索引擎的网络爬虫实现方法
2015/03/30 Python
python 获取当天每个准点时间戳的实例
2018/05/22 Python
Python拼接字符串的7种方法总结
2018/11/01 Python
Windows系统下pycharm中的pip换源
2020/02/23 Python
html5构建触屏网站之touch事件介绍
2013/01/07 HTML / CSS
HTML5添加禁止缩放功能
2017/11/03 HTML / CSS
斯洛伐克家具和时尚装饰品购物网站:Butlers.sk
2019/09/08 全球购物
说一下Linux下有关用户和组管理的命令
2014/08/18 面试题
总裁助理岗位职责
2014/02/17 职场文书
揭牌仪式主持词
2014/03/19 职场文书
超市开业庆典策划方案
2014/05/14 职场文书
张家口市高新区党工委群众路线教育实践活动整改方案
2014/10/25 职场文书
2014年人大工作总结
2014/12/10 职场文书
python设置 matplotlib 正确显示中文的四种方式
2021/05/10 Python
Python进度条的使用
2021/05/17 Python
解决Mysql的left join无效及使用的注意事项说明
2021/07/01 MySQL
Mybatis-plus配置分页插件返回统一结果集
2022/06/21 Java/Android