视图组件

  基于以往我们所用的视图函数,我们发现其中冗余的代码比较多,今天就来对其进行封装,争取做一个代码洁癖者

  原来我们的视图函数:

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的更多相关文章

  1. 问题在哪?动态菜单条-------Day86

    今天做了一个动态菜单条,先上图片,简单说一下我想实现的效果: 就是以下这个地方,随着鼠标指到哪,它就划到哪,并有一个惯性的幅度,并且滑动距离越远,停住的时候惯性越大,摆动幅度越大,这就是我大概想实现的 ...

  2. python 全栈开发,Day86(上传文件,上传头像,CBV,python读写Excel,虚拟环境virtualenv)

    一.上传文件 上传一个图片 使用input type="file",来上传一个文件.注意:form表单必须添加属性enctype="multipart/form-data ...

  3. day--86(MongoDB数据库)

    mongodb数据库基本操作指令 ps::mongodb中的 文档,集合的概念(和mysql中的表对比理解): 集合(mongodb)--相当于mysql中的表 文档(mongodb)--相当于mys ...

  4. day86:luffy:前端发送请求生成订单&结算页面优惠劵的实现

    目录 1.前端发送请求生成订单 1.前端点击支付按钮生成订单 2.结算成功之后应该清除结算页面的数据 3.后端计算结算页面总原价格和总的真实价格并存到数据库订单表中 2.优惠劵 1.准备工作 2.前端 ...

  5. 老男孩Python高级全栈开发工程师三期完整无加密带课件(共104天)

    点击了解更多Python课程>>> 老男孩Python高级全栈开发工程师三期完整无加密带课件(共104天) 课程大纲 1.这一期比之前的Python培新课程增加了很多干货:Linux ...

  6. 国内某Python大神自创完整版,系统性学习Python

    很多小伙伴纠结于这个一百天的时间,我觉得完全没有必要,也违背了我最初放这个大纲上来的初衷,我是觉得这个学习大纲还不错,自学按照这个来也能相对系统的学习知识,而不是零散细碎的知识最后无法整合,每个人的基 ...

  7. 22期老男孩Ptython全栈架构师视频教程

    老男孩Ptython全栈架构师视频教程 Python最新整理完整版22期视频教程 超60G课程容量<ignore_js_op> <ignore_js_op> <ignor ...

随机推荐

  1. Salesforce小知识:在简档中设置Visualforce页面的权限

    简档(Profile)中的 Visualforce 页面访问权限 在Salesforce中,对于自定义的简档,可以设置"Visualforce 页面访问"的权限. Visualfo ...

  2. Salesforce的报表和仪表板

    报表是现代企业中最常用到的功能之一.Salesforce中提供了强大的报表和仪表板功能. 报表和仪表板简介 报表是一组数据展示,用户可以自定义规则,只有符合相应规则的数据才会显示出来. Salesfo ...

  3. python中if else流程判断

    _username='Lily' _password=' username=input("username:") password=input("password:&qu ...

  4. centos 7.2 64位 docker安装lamp环境

    1. 删除docker可能有的早期版本 yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docke ...

  5. webApi core2 DI通过代码来获取容器里面已注入的对象

    请求服务 来自 HttpContext 的一次 ASP.NET 请求中可用的服务通过 RequestServices 集合公开的. 请求服务将你配置的服务和请求描述为应用程序的一部分.当你的对象指定依 ...

  6. 第七章 鼠标(CONNECT)

    /* CONNECT.C -- Connect-the-Dots Mouse Demo Program (c) Charles Petzold,1998 */ #include <Windows ...

  7. Request获取客户端IP

    获取客户端的IP地址的方法是:request.getRemoteAddr() ,这种方法在大部分情况下都是有效的.但是在通过了Apache,Squid等反向代理软件就不能获取到客户端的真实IP地址了. ...

  8. 最大公约数&&最小公倍数

    //最大公约数(greatest common divisor),运用递归 int gcd(int a,int b){//注意a要求大于b return !b?a:gcd(b,a%b); } //最小 ...

  9. php程序开发之实现网页跳转

    php程序开发之实现网页跳转的三种方式 2017年04月16日 20:44:14 阅读数:3352 PHP目前是用来开发WEB项目的首选语言.Web项目中,从一个网页跳转到另一个网页是最常用的技术之一 ...

  10. 记录:一个SQL SERVER奇怪的问题。

    今天遇到了一个奇怪的问题.始终没搞清楚是怎么回事.先记一下 1.首先有张表a,包含字段 编号.日期(varchar(250)),数值 发生日期字段有非正常日期字符串,有NULL,空字符串,可能是误触键 ...