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高效编程技巧
Jan 07 Python
python批量生成本地ip地址的方法
Mar 23 Python
python用reduce和map把字符串转为数字的方法
Dec 19 Python
Python matplotlib绘图可视化知识点整理(小结)
Mar 16 Python
解决python 输出是省略号的问题
Apr 19 Python
numpy.random模块用法总结
May 27 Python
关于Python内存分配时的小秘密分享
Sep 05 Python
Python写出新冠状病毒确诊人数地图的方法
Feb 12 Python
python画图常规设置方式
Mar 05 Python
Python实现读取并写入Excel文件过程解析
May 27 Python
关于python scrapy中添加cookie踩坑记录
Nov 17 Python
Django与AJAX实现网页动态数据显示的示例代码
Feb 24 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编码规范-php coding standard
2007/03/16 PHP
PHP防注入安全代码
2008/04/09 PHP
PHP 多维数组的排序问题 根据二维数组中某个项排序
2011/11/09 PHP
需要注意的几个PHP漏洞小结
2012/02/05 PHP
PHP下获取上个月、下个月、本月的日期(strtotime,date)
2014/02/02 PHP
php获取mysql字段名称和其它信息的例子
2014/04/14 PHP
php的ddos攻击解决方法
2015/01/08 PHP
微信公众平台开发实现2048游戏的方法
2015/04/15 PHP
CI分页类首页、尾页不显示的解决方法
2016/03/28 PHP
JQuery中dataGrid设置行的高度示例代码
2014/01/03 Javascript
javascript数组去重小结
2016/03/07 Javascript
前端js实现文件的断点续传 后端PHP文件接收
2016/10/14 Javascript
js实现PC端和移动端刮卡效果
2020/03/27 Javascript
js实现滑动到页面底部自动加载更多功能
2017/02/15 Javascript
微信小程序switch组件使用详解
2018/01/31 Javascript
bootstrap中selectpicker下拉框使用方法实例
2018/03/22 Javascript
Vue 组件传值几种常用方法【总结】
2018/05/28 Javascript
详解vue项目中如何引入全局sass/less变量、function、mixin
2018/06/02 Javascript
jQuery实现轮播图及其原理详解
2020/04/12 jQuery
layer设置maxWidth及maxHeight解决方案
2019/07/26 Javascript
Vue移动端项目实现使用手机预览调试操作
2020/07/18 Javascript
[03:38]2014DOTA2西雅图国际邀请赛 VG战队巡礼
2014/07/07 DOTA
[00:35]2016完美“圣”典风云人物:冷冷宣传片
2016/12/08 DOTA
python optparse模块使用实例
2015/04/09 Python
python实现文件快照加密保护的方法
2015/06/30 Python
Python中的heapq模块源码详析
2019/01/08 Python
Python----数据预处理代码实例
2019/03/20 Python
python实现nao机器人身体躯干和腿部动作操作
2019/04/29 Python
Python tkinter实现简单加法计算器代码实例
2020/05/13 Python
Python使用socket_TCP实现小文件下载功能
2020/10/09 Python
雅诗兰黛(Estee Lauder)英国官方网站:世界顶级化妆品牌
2016/12/29 全球购物
世界上最具创新性的增强型知名运动品牌:Proviz
2018/04/03 全球购物
美术专业学生个人自我评价
2013/09/19 职场文书
学生会主席竞聘书
2014/03/31 职场文书
学生安全责任书范本
2014/07/24 职场文书
学生意外伤害赔偿协议书
2014/09/17 职场文书