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代码写的12306订票代码
Dec 20 Python
Python实现新浪博客备份的方法
Apr 27 Python
详解Python的collections模块中的deque双端队列结构
Jul 07 Python
利用Python中SocketServer 实现客户端与服务器间非阻塞通信
Dec 15 Python
python实现报表自动化详解
Nov 16 Python
深入flask之异步非堵塞实现代码示例
Jul 31 Python
python利用多种方式来统计词频(单词个数)
May 27 Python
Python3使用PySynth制作音乐的方法
Sep 09 Python
Python利用FFT进行简单滤波的实现
Feb 26 Python
Xadmin+rules实现多选行权限方式(级联效果)
Apr 07 Python
如何将tensorflow训练好的模型移植到Android (MNIST手写数字识别)
Apr 22 Python
python3+opencv 使用灰度直方图来判断图片的亮暗操作
Jun 02 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 session 错误
2009/05/21 PHP
php实现判断访问来路是否为搜索引擎机器人的方法
2015/04/15 PHP
yii框架无限极分类的实现方法
2017/04/08 PHP
php提交表单时保留多个空格及换行的文本样式的方法
2017/06/20 PHP
PHP Web表单生成器案例分析
2020/06/02 PHP
网页设计常用的一些技巧
2006/12/22 Javascript
jquery获取input的value问题说明
2010/08/19 Javascript
JS的replace方法详细介绍
2012/11/09 Javascript
jquery阻止冒泡事件使用模拟事件
2013/09/06 Javascript
JS兼容浏览器的导出Excel(CSV)文件的方法
2014/05/03 Javascript
jquery获取当前元素索引值用法实例
2015/06/10 Javascript
两款JS脚本判断手机浏览器类型跳转WAP手机网站
2015/10/16 Javascript
[原创]JQuery 在表单提交之前修改 提交的值
2016/04/14 Javascript
深入剖析JavaScript中的函数currying柯里化
2016/04/29 Javascript
JavaScript 弹出子窗体并返回结果到父窗体的实现代码
2016/05/28 Javascript
基于Vue实例生命周期(全面解析)
2017/08/16 Javascript
ES6 Promise对象的应用实例分析
2019/06/27 Javascript
vue + typescript + video.js实现 流媒体播放 视频监控功能
2019/07/07 Javascript
微信小程序自定义tabBar的踩坑实践记录
2020/11/06 Javascript
python多线程编程中的join函数使用心得
2014/09/02 Python
SVM基本概念及Python实现代码
2017/12/27 Python
Python continue继续循环用法总结
2018/06/10 Python
选择Python写网络爬虫的优势和理由
2019/07/07 Python
pytorch masked_fill报错的解决
2020/02/18 Python
python有几个版本
2020/06/17 Python
美国知名女性服饰品牌:New York & Company
2017/03/23 全球购物
馥蕾诗美国官网:Fresh美国
2019/10/09 全球购物
加拿大领先家居家具网上购物:Aosom.ca
2020/05/27 全球购物
房地产项目策划书
2014/02/05 职场文书
逃课上网检讨书
2014/02/20 职场文书
校园安全演讲稿
2014/05/09 职场文书
2014年环境卫生工作总结
2014/11/24 职场文书
超市督导岗位职责
2015/04/10 职场文书
2017春节晚会开幕词
2016/03/03 职场文书
PyTorch 如何自动计算梯度
2021/05/23 Python
win11高清晰音频管理器在哪里?win11找不到高清晰音频管理器解决办法
2022/04/08 数码科技