day86
视图组件
基于以往我们所用的视图函数,我们发现其中冗余的代码比较多,今天就来对其进行封装,争取做一个代码洁癖者
原来我们的视图函数:
class Book(APIView):
def get(self, request):
book = models.Books.objects.all()
book_ser = Ser.Books(book, many=True)
return JsonResponse(book_ser.data, safe=False) def post(self, request):
new_book = Ser.Books(data=request.data)
if new_book.is_valid():
new_book.save()
return JsonResponse(new_book.data)
else:
return JsonResponse(new_book.errors) class BookDetail(APIView):
def get(self, request, pk):
book = models.Books.objects.filter(pk=pk).first()
book_ser = Ser.Books(book, many=False)
return JsonResponse(book_ser.data, safe=False) def put(self, request,pk):
book = models.Books.objects.filter(pk=pk).first()
new_book = Ser.Books(data=request.data,instance=book)
if new_book.is_valid():
new_book.save()
return JsonResponse(new_book.data)
else:
return JsonResponse(new_book.errors)
手动一层封装:
创建了List和Create辅助类,节省了代码
class List:
def list(self, request):
queryset = self.query
info = self.serializers(queryset, many=True)
return JsonResponse(info.data, safe=False) class Create:
def create(self, request):
new = self.serializers(data=request.data)
if new.is_valid():
new.save()
return JsonResponse(new.data, safe=False)
else:
return JsonResponse(new.errors) class Book(APIView, List, Create):
query = models.Books.objects.all()
serializers = Ser.Books def get(self, request):
return self.list(request) def post(self, request):
return self.create(request) class Publish(APIView,List,Create):
query = models.Publish.objects.all()
serializers = Ser.Publish def get(self, request):
return self.list(request) def post(self, request):
return self.create(request)
使用drf自带的二层封装:
说明:
'''
CreateModelMixin: 增加
DestroyModelMixin:删
UpdateModelMixin:改
ListModelMixin:查全部
RetrieveModelMixin:查一条
'''
from rest_framework.generics import GenericAPIView
from rest_framework.mixins import ListModelMixin, CreateModelMixin, DestroyModelMixin, UpdateModelMixin, \
RetrieveModelMixin class Book(GenericAPIView, ListModelMixin, CreateModelMixin):
queryset = models.Books.objects.all()
serializer_class = Ser.Books def get(self, request):
return self.list(request) def post(self, request):
return self.create(request) class Publish(GenericAPIView, ListModelMixin, CreateModelMixin):
queryset = models.Publish.objects.all()
serializer_class = Ser.Publish def get(self, request):
return self.list(request) def post(self, request):
return self.create(request) class BookDetail(GenericAPIView, RetrieveModelMixin, DestroyModelMixin, UpdateModelMixin):
queryset = models.Books.objects.all()
serializer_class = Ser.Books def get(self, request, pk):
return self.retrieve(request, pk) def put(self, request, pk):
return self.update(request, pk) def delete(self, request, pk):
return self.destroy(request, pk)
第三层封装
drf中自己写了一个类继承了封装的类里面写了get、post等方法
from rest_framework.generics import RetrieveDestroyAPIView, ListCreateAPIView # class Book(GenericAPIView, ListModelMixin, CreateModelMixin):
class Book(ListCreateAPIView):
queryset = models.Books.objects.all()
serializer_class = Ser.Books # class BookDetail(GenericAPIView, RetrieveModelMixin, DestroyModelMixin, UpdateModelMixin):
class BookDetail(RetrieveDestroyAPIView):
queryset = models.Books.objects.all()
serializer_class = Ser.Books
最终的封装(不建议使用)
说明:
'''
终极封装是因为这个类继承了CreateModelMixin,RetrieveModelMixin,UpdateModelMixin,DestroyModelMixin,ListModelMixin,GenericViewSet):
注:在路由中配置时需要传递key:value对应的方法参数,保证对应的方法有对应的参数
{'get': 'retrieve', 'put': 'update', 'delete': 'destroy'}
'''
from rest_framework.viewsets import ModelViewSet
from rest_framework.renderers import JSONOpenAPIRenderer, BrowsableAPIRenderer, HTMLFormRenderer class Book(ModelViewSet):
# renderer_classes = [JSONOpenAPIRenderer, BrowsableAPIRenderer, HTMLFormRenderer]
queryset = models.Books.objects.all()
serializer_class = Ser.Books class Publish(ModelViewSet):
queryset = models.Publish.objects.all()
serializer_class = Ser.Publish
魔法方法(重点)
# 建议用魔法类ViewSetMixin
from rest_framework.viewsets import ViewSetMixin
day86的更多相关文章
- 问题在哪?动态菜单条-------Day86
今天做了一个动态菜单条,先上图片,简单说一下我想实现的效果: 就是以下这个地方,随着鼠标指到哪,它就划到哪,并有一个惯性的幅度,并且滑动距离越远,停住的时候惯性越大,摆动幅度越大,这就是我大概想实现的 ...
- python 全栈开发,Day86(上传文件,上传头像,CBV,python读写Excel,虚拟环境virtualenv)
一.上传文件 上传一个图片 使用input type="file",来上传一个文件.注意:form表单必须添加属性enctype="multipart/form-data ...
- day--86(MongoDB数据库)
mongodb数据库基本操作指令 ps::mongodb中的 文档,集合的概念(和mysql中的表对比理解): 集合(mongodb)--相当于mysql中的表 文档(mongodb)--相当于mys ...
- day86:luffy:前端发送请求生成订单&结算页面优惠劵的实现
目录 1.前端发送请求生成订单 1.前端点击支付按钮生成订单 2.结算成功之后应该清除结算页面的数据 3.后端计算结算页面总原价格和总的真实价格并存到数据库订单表中 2.优惠劵 1.准备工作 2.前端 ...
- 老男孩Python高级全栈开发工程师三期完整无加密带课件(共104天)
点击了解更多Python课程>>> 老男孩Python高级全栈开发工程师三期完整无加密带课件(共104天) 课程大纲 1.这一期比之前的Python培新课程增加了很多干货:Linux ...
- 国内某Python大神自创完整版,系统性学习Python
很多小伙伴纠结于这个一百天的时间,我觉得完全没有必要,也违背了我最初放这个大纲上来的初衷,我是觉得这个学习大纲还不错,自学按照这个来也能相对系统的学习知识,而不是零散细碎的知识最后无法整合,每个人的基 ...
- 22期老男孩Ptython全栈架构师视频教程
老男孩Ptython全栈架构师视频教程 Python最新整理完整版22期视频教程 超60G课程容量<ignore_js_op> <ignore_js_op> <ignor ...
随机推荐
- python自动化开发-5
列表生成式 生成器 迭代器 列表生成式 举个例子 列表[0, 1, 2, 3, 4, 5, 6],要求把列表里的每个值加1,如何实现呢? L=[0, 1, 2, 3, 4, 5, 6] a={i+ ...
- JVM、Gc工作机制详解
JVM主要包括四个部分: 类加载器(ClassLoad) 执行引擎 内存区: 本地方法接口:类似于jni调本地native方法 内存区包括四个部分: 1.方法区:包含了静态变量.常量池.构造函数等 2 ...
- Android View体系(一)视图坐标系
前言 Android View体系是界面编程的核心,他的重要性不亚于Android四大组件,在这个系列中我会陆续讲到View坐标系.View的滑动.View的事件分发等文章来逐步介绍Android V ...
- 利用搜狐新闻语料库训练100维的word2vec——使用python中的gensim模块
关于word2vec的原理知识参考文章https://www.cnblogs.com/Micang/p/10235783.html 语料数据来自搜狐新闻2012年6月—7月期间国内,国际,体育,社会, ...
- Info.plist的CFBundleIdentifier、CFBundleName、BundleDisplayName
plist关键字段: CFBundleIdentifier:应用包名.唯一标识 CFBundleVersion:文件版本号,可以每次发版本递增 CFBundleShortVersionString:a ...
- MSSQL清理所有用户数据库日志(SQLSERVER2008)
USE [master]; SET NOCOUNT ON; )=''; )=''; DECLARE @clearSql VARCHAR(MAX)=''; ; ,),TMP_WHILE_FLAG, T. ...
- Android QMI机制
android QMI机制---概论 android QMI机制---QMUX android QMI机制---Qcril初始化流程 android QMI机制---QCRIL消息发送 android ...
- 安装.Net Framework 4.6.2时出现“无法建立到信任根颁发机构的证书链”解决方法
在安装Microsoft .NET Framework 4.6.2脱机包时提示 无法建立到信任根颁发机构的证书链 实际上是要安装一个根证书.解决方案如下(因无法贴链接,可百度搜索“mamicode.c ...
- 【PAT】B1072 开学寄语(20 分)
代码注释应该很清晰 先存下违禁品,放到数组中,未使用map #include<cstdio> #include<string.h> int wupin[10],N,M; boo ...
- windows下编写shell脚本执行错误
在 windows 下,换行符是 \r\n,在linux下,换行符是 \n.如果你在IDEA里写sh脚本,可以手动设置脚本的换行符为 \n,如果你用notepad++写脚本,可以显示所有字符,以便明确 ...