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 相关文章推荐
Python3学习笔记之列表方法示例详解
Oct 06 Python
Python 加密的实例详解
Oct 09 Python
K-means聚类算法介绍与利用python实现的代码示例
Nov 13 Python
python爬虫系列Selenium定向爬取虎扑篮球图片详解
Nov 15 Python
基于Python中单例模式的几种实现方式及优化详解
Jan 09 Python
Python装饰器用法示例小结
Feb 11 Python
详解windows python3.7安装numpy问题的解决方法
Aug 13 Python
OpenCV搞定腾讯滑块验证码的实现代码
May 18 Python
Django自关联实现多级联动查询实例
May 19 Python
python使用隐式循环快速求和的实现示例
Sep 11 Python
python实现双人五子棋(终端版)
Dec 30 Python
python编程项目中线上问题排查与解决
Nov 01 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
历史证明,懒惰才是推动科学发展技术进步的动力
2021/03/02 无线电
vBulletin HACK----关于排版的两个HACK
2006/10/09 PHP
深入eAccelerator与memcached的区别详解
2013/06/06 PHP
实例介绍PHP的Reflection反射机制
2014/08/05 PHP
laravel 自定义常量的两种方案
2019/10/14 PHP
javascript面向对象的方式实现的弹出层效果代码
2010/01/28 Javascript
文字不间断滚动(上下左右)实例代码
2013/04/21 Javascript
jquery数据验证插件(自制,简单,练手)实例代码
2013/10/24 Javascript
JQuery文字列表向上滚动的代码
2013/11/13 Javascript
jquery简单实现滚动条下拉DIV固定在头部不动
2013/11/25 Javascript
js常用数组操作方法简明总结
2014/06/20 Javascript
JS选取DOM元素的简单方法
2016/07/08 Javascript
如何利用JSHint减少JavaScript的错误
2016/08/23 Javascript
基于Layer+jQuery的自定义弹框
2020/05/26 Javascript
详解nodejs微信公众号开发——1.接入微信公众号
2017/04/10 NodeJs
JavaScript纯色二维码变成彩色二维码
2020/07/23 Javascript
jQueryeasyui 中如何使用datetimebox 取两个日期间相隔的天数
2017/06/13 jQuery
跨域解决之JSONP和CORS的详细介绍
2018/11/21 Javascript
详解几十行代码实现一个vue的状态管理
2019/01/28 Javascript
微信端调取相册和摄像头功能,实现图片上传,并上传到服务器
2019/05/16 Javascript
js变量值传到php过程详解 将php解析成数据
2019/06/26 Javascript
微信小程序实现搜索框功能及踩过的坑
2020/06/19 Javascript
[45:59]EG vs OG 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/18 DOTA
wxpython 学习笔记 第一天
2009/02/09 Python
python+ffmpeg视频并发直播压力测试
2018/03/06 Python
利用Python查看微信共同好友功能的实现代码
2019/04/24 Python
关于Python形参打包与解包小技巧分享
2019/08/24 Python
Python3运算符常见用法分析
2020/02/14 Python
HTML5对手机页面长按会粘贴复制禁用的解决方法
2016/07/19 HTML / CSS
理肤泉俄罗斯官网:La Roche-Posay俄罗斯
2018/07/24 全球购物
Arti-shopping中文官网:大型海外商品一站式直邮平台
2020/03/23 全球购物
vue项目实现分页效果
2021/03/24 Vue.js
英语翻译系毕业生求职信
2013/09/29 职场文书
小学生关于梦想的演讲稿
2014/08/22 职场文书
党员证明信
2015/06/19 职场文书
python超详细实现完整学生成绩管理系统
2022/03/17 Python