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 常用 PEP8 编码规范详解
Jan 22 Python
Python中input与raw_input 之间的比较
Aug 20 Python
Python Socket编程之多线程聊天室
Jul 28 Python
django框架使用orm实现批量更新数据的方法
Jun 21 Python
python画图——实现在图上标注上具体数值的方法
Jul 08 Python
python 字典套字典或列表的示例
Dec 16 Python
Python图像处理库PIL的ImageEnhance模块使用介绍
Feb 26 Python
解决 jupyter notebook 回车换两行问题
Apr 15 Python
举例讲解Python装饰器
Dec 24 Python
利用Python批量识别电子账单数据的方法
Feb 08 Python
python线程优先级队列知识点总结
Feb 28 Python
tensorflow中的梯度求解及梯度裁剪操作
May 26 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新手上路(五)
2006/10/09 PHP
PHP编程函数安全篇
2013/01/08 PHP
php中关于socket的系列函数总结
2015/05/18 PHP
WordPress中获取所使用的模板的页面ID的简单方法
2015/12/31 PHP
Laravel的Auth验证Token验证使用自定义Redis的例子
2019/09/30 PHP
YII2框架中添加自定义模块的方法实例分析
2020/03/18 PHP
基于jquery的无刷新分页技术
2011/06/11 Javascript
jQuery操作元素css样式的三种方法
2014/06/04 Javascript
jquery解析json格式数据的方法(对象、字符串)
2015/11/24 Javascript
jquery实现刷新随机变化样式特效(tag标签样式)
2017/02/03 Javascript
angular4 如何在全局设置路由跳转动画的方法
2017/08/30 Javascript
如何开发出更好的JavaScript模块
2017/12/22 Javascript
解决angular2在双向数据绑定时[(ngModel)]无法使用的问题
2018/09/13 Javascript
vue项目动态设置页面title及是否缓存页面的问题
2018/11/08 Javascript
微信小程序实现侧边分类栏
2019/10/21 Javascript
vue实现在线学生录入系统
2020/05/30 Javascript
[01:08:57]2014 DOTA2国际邀请赛中国区预选赛 5 23 CIS VS LGD第二场
2014/05/24 DOTA
[57:59]EG vs Secret 2018国际邀请赛淘汰赛BO3 第一场 8.22
2018/08/23 DOTA
[00:20]TI9观赛名额抽取Ⅱ
2019/07/24 DOTA
用python读写excel的方法
2014/11/18 Python
详解如何在Apache中运行Python WSGI应用
2019/01/02 Python
Python 调用PIL库失败的解决方法
2019/01/08 Python
Python3.7 dataclass使用指南小结
2019/02/22 Python
python 缺失值处理的方法(Imputation)
2019/07/02 Python
Python代码太长换行的实现
2019/07/05 Python
pytorch 状态字典:state_dict使用详解
2020/01/17 Python
pandas数据选取:df[] df.loc[] df.iloc[] df.ix[] df.at[] df.iat[]
2020/04/24 Python
Python大批量搜索引擎图像爬虫工具详解
2020/11/16 Python
10种CSS3实现的loading动画,挑一个走吧?
2020/11/16 HTML / CSS
庆元旦文艺演出主持词
2014/03/27 职场文书
运动会开幕式主持词
2014/03/28 职场文书
煤矿安全生产责任书
2014/04/15 职场文书
兴趣小组活动总结
2014/05/05 职场文书
关爱残疾人演讲稿
2014/05/24 职场文书
2015年清剿火患专项行动工作总结
2015/07/27 职场文书
python自动获取微信公众号最新文章的实现代码
2022/07/15 Python