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进行数据科学工作的简单入门教程
Apr 01 Python
详解Python中的join()函数的用法
Apr 07 Python
浅析Python中将单词首字母大写的capitalize()方法
May 18 Python
python处理二进制数据的方法
Jun 03 Python
解析Python编程中的包结构
Oct 25 Python
浅谈Python 对象内存占用
Jul 15 Python
Python多线程实现同步的四种方式
May 02 Python
Python3.5内置模块之time与datetime模块用法实例分析
Apr 27 Python
python用for循环求和的方法总结
Jul 08 Python
python logging 重复写日志问题解决办法详解
Aug 04 Python
tensorflow+k-means聚类简单实现猫狗图像分类的方法
Apr 28 Python
matlab xlabel位置的设置方式
May 21 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常见漏洞攻击分析
2016/02/21 PHP
php数组冒泡排序算法实例
2016/05/06 PHP
php排序算法实例分析
2016/10/17 PHP
PHP实现防盗链的方法分析
2017/07/25 PHP
PHP实现提取多维数组指定一列的方法总结
2019/12/04 PHP
jquery实现搜索框常见效果的方法
2015/01/22 Javascript
JavaScript中标识符提升问题
2015/06/11 Javascript
基于Bootstrap里面的Button dropdown打造自定义select
2016/05/30 Javascript
JS for循环中i++ 和 ++i的区别介绍
2016/07/20 Javascript
jQuery实现为LI列表前3行设置样式的方法【2种方法】
2016/09/04 Javascript
基于bootstrap的文件上传控件bootstrap fileinput
2016/12/23 Javascript
如何选择jQuery版本 1.x? 2.x? 3.x?
2017/04/01 jQuery
深入理解vue2.0路由如何配置问题
2017/07/18 Javascript
javascript浏览器用户代理检测脚本实现方法
2017/10/27 Javascript
新年快乐! javascript实现超级炫酷的3D烟花特效
2019/01/30 Javascript
vue中的inject学习教程
2019/04/24 Javascript
解决vue-cli输入命令vue ui没效果的问题
2020/11/17 Javascript
[30:00]完美世界DOTA2联赛PWL S2 Rebirth vs LBZS 第二场 11.28
2020/12/01 DOTA
给Python入门者的一些编程建议
2015/06/15 Python
python中pandas.DataFrame的简单操作方法(创建、索引、增添与删除)
2017/03/12 Python
python 编写简单网页服务器的实例
2018/06/01 Python
树莓派使用USB摄像头和motion实现监控
2019/06/22 Python
基于python调用psutil模块过程解析
2019/12/20 Python
Python-jenkins模块之folder相关操作介绍
2020/05/12 Python
Python web框架(django,flask)实现mysql数据库读写分离的示例
2020/11/18 Python
python 实现性别识别
2020/11/21 Python
python文件路径操作方法总结
2020/12/21 Python
俄罗斯有趣和原创礼物网上商店:MagicMag
2019/08/01 全球购物
西雅图的买手店:Totokaelo
2019/10/19 全球购物
shell程序中如何注释
2012/01/28 面试题
会计专业求职信范文
2015/03/19 职场文书
开业典礼致辞
2015/07/29 职场文书
2016年“5.12”护士节致辞
2015/07/31 职场文书
2016入党积极分子党课学习心得体会
2015/10/09 职场文书
教学反思怎么写
2016/02/24 职场文书
读《瓦尔登湖》有感:每个人都需要一个瓦尔登湖
2019/10/17 职场文书