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多线程编程方式分析示例详解
Dec 06 Python
Python实现端口复用实例代码
Jul 03 Python
Python做简单的字符串匹配详解
Mar 21 Python
Python实现获取照片拍摄日期并重命名的方法
Sep 30 Python
Python实现识别手写数字大纲
Jan 29 Python
Python3.5基础之NumPy模块的使用图文与实例详解
Apr 24 Python
pyqt弹出新对话框,以及关闭对话框获取数据的实例
Jun 18 Python
PyQt5实现从主窗口打开子窗口的方法
Jun 19 Python
pandas factorize实现将字符串特征转化为数字特征
Dec 19 Python
Python 模拟生成动态产生验证码图片的方法
Feb 01 Python
python实现遍历文件夹图片并重命名
Mar 23 Python
Python中Qslider控件实操详解
Feb 20 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
javascript 遍历验证所有文本框的值
2009/08/27 Javascript
Javascript中的window.event.keyCode使用介绍
2011/04/26 Javascript
JQuyer $.post 与 $.ajax 访问WCF ajax service 时的问题需要注意的地方
2011/09/20 Javascript
js简单实现让文本框内容逐个字的显示出来
2013/10/22 Javascript
将list转换为json失败的原因
2013/12/17 Javascript
jquery日历控件实现方法分享
2014/03/07 Javascript
JavaScript中的console.assert()函数介绍
2014/12/29 Javascript
在JavaScript应用中使用RequireJS来实现延迟加载
2015/07/01 Javascript
jQuery中Find选择器用法示例
2016/09/21 Javascript
nodejs搭建本地http服务器教程
2017/03/13 NodeJs
js时间查询插件使用详解
2017/04/07 Javascript
ES6正则表达式扩展笔记
2017/07/25 Javascript
Vue基于NUXT的SSR详解
2017/10/24 Javascript
Web安全之XSS攻击与防御小结
2018/12/13 Javascript
浅谈Layui的eleTree树式选择器使用方法
2019/09/25 Javascript
vue 子组件和父组件传值的示例
2020/09/11 Javascript
python处理文本文件并生成指定格式的文件
2014/07/31 Python
python threading模块操作多线程介绍
2015/04/08 Python
浅谈pandas用groupby后对层级索引levels的处理方法
2018/11/06 Python
python最小生成树kruskal与prim算法详解
2019/01/17 Python
对IPython交互模式下的退出方法详解
2019/02/16 Python
python实现最大子序和(分治+动态规划)
2019/07/05 Python
kali中python版本的切换方法
2019/07/11 Python
HTML5和以前HTML4的区别整理
2013/10/20 HTML / CSS
爱普生美国官网:Epson美国
2018/11/05 全球购物
高中三年学习生活的自我评价
2013/10/10 职场文书
应付会计岗位职责
2013/12/12 职场文书
2014年预备党员学习两会心得体会
2014/03/17 职场文书
广播体操口号
2014/06/18 职场文书
机械专业求职信范文
2014/07/15 职场文书
安全责任书范文
2014/08/25 职场文书
2014年教师节座谈会发言稿
2014/09/10 职场文书
食品仓管员岗位职责
2015/04/01 职场文书
Django中session进行权限管理的使用
2021/07/09 Python
Python基本数据类型之字符串str
2021/07/21 Python
nginx.conf配置文件结构小结
2022/04/08 Servers