Restful_framework视图组件代码实例解析


Posted in Python onNovember 17, 2020

一、基本视图

写一个出版社的增删查改resful接口

要自己事先创建好django项目,并创建好表,添加完记录

路由:

url(r'^publish/$', views.PublishView.as_view()),
url(r'^publish/(?P<pk>\d+)/$', views.PublishDetailView.as_view()),

视图:

from api import modelsfrom rest_framework import serializersfrom rest_framework.response import Responsefrom rest_framework.views import APIView
class PublishSerializers(serializers.ModelSerializer):
  class Meta:
    model=models.Publish
    fields='__all__'

class PublishView(APIView):
#查询出版社表中所有记录
  def get(self, request):
    publish_list = models.Publish.objects.all()
    bs = PublishSerializers(publish_list, many=True)
    # 序列化数据

    return Response(bs.data)  #返回的结果是列表中套字典


  def post(self, request):
    # 添加一条数据
    print(request.data)

    bs=PublishSerializers(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=PublishSerializers(publish_obj,many=False)
    return Response(bs.data)
 #更新某一条数据
  def put(self,request,pk):
    publish_obj = models.Publish.objects.filter(pk=pk).first()

    bs=PublishSerializers(data=request.data,instance=publish_obj)
    if bs.is_valid():
      bs.save() # update
      return Response(bs.data)
    else:
      return Response(bs.errors)
 #删除某一条数据
  def delete(self,request,pk):
    models.Publish.objects.filter(pk=pk).delete()

    return Response("")

二、mixins类和generic类编写视图

路由:

url(r'^publishes$', views.Publish.as_view()),
url(r'^publish/(?P<pk>\d+)', views.PublishDetail.as_view()),

视图:

from api import models
from rest_framework import serializers
from rest_framework import mixins
from rest_framework.generics import GenericAPIView
class PublishSer(serializers.ModelSerializer):
  class Meta:
    model=models.Publish
    fields='__all__'
class Publish(GenericAPIView,mixins.ListModelMixin,mixins.CreateModelMixin):
  queryset = models.Publish.objects.all()
  serializer_class = PublishSer
  def get(self,request):
    return self.list(request)  #在ListModelMixin下有一个list方法,返回的就是查询的结果:Response(serializer.data)
  def post(self,request):
    return self.create(request) #已经封装好了,帮我们做校验和序列化,返回的是添加成功的记录
class PublishDetail(GenericAPIView,mixins.DestroyModelMixin,mixins.RetrieveModelMixin,mixins.UpdateModelMixin):

  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)

三、使用generic下ListCreateAPIView和RetrieveUpdateDestroyAPIView

路由:

url(r'^publishes$', views.Publish.as_view()),
url(r'^publish/(?P<pk>\d+)', views.PublishDetail.as_view()),

视图:

from api import models
from rest_framework import mixins
from rest_framework.generics import GenericAPIView
from rest_framework.generics import ListCreateAPIView,RetrieveUpdateDestroyAPIView
from rest_framework import serializers
class Publishser(serializers.ModelSerializer):
  class Meta:
    model=models.Publish
    fields='__all__'

class Publish(ListCreateAPIView):
  queryset = models.Publish.objects.all()
  serializer_class = Publishser

class PublishDetail(RetrieveUpdateDestroyAPIView):
  queryset = models.Publish.objects.all()
  serializer_class = Publishser

四、使用ModelViewSet

路由:

url(r'^publish$',views.Publish.as_view({'get':'list','post':'create'})),
url(r'^publish/(?P<pk>\d+)', views.Publish.as_view({'get': 'retrieve', 'put': 'update', 'delete': 'destroy'})),

视图:

from rest_framework.viewsets import ModelViewSet
from api import models
from rest_framework import serializers
class Publishser(serializers.ModelSerializer):
  class Meta:
    model=models.Publish
    fields='__all__'
class Publish(ModelViewSet):
  queryset = models.Publish.objects.all()
  serializer_class = Publishser

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python根据出生日期返回年龄的方法
Mar 26 Python
python3使用requests模块爬取页面内容的实战演练
Sep 25 Python
解决pandas 作图无法显示中文的问题
May 24 Python
pytorch中tensor的合并与截取方法
Jul 26 Python
利用Python如何批量修改数据库执行Sql文件
Jul 29 Python
OpenCV2从摄像头获取帧并写入视频文件的方法
Aug 03 Python
Django框架文件上传与自定义图片上传路径、上传文件名操作分析
May 10 Python
python 求某条线上特定x值或y值的点坐标方法
Jul 09 Python
pytorch中如何使用DataLoader对数据集进行批处理的方法
Aug 06 Python
大家都说好用的Python命令行库click的使用
Nov 07 Python
Python3将ipa包中的文件按大小排序
Apr 17 Python
Python办公自动化PPT批量转换操作
Sep 15 Python
如何将Pycharm中调整字体大小的方式设置为&quot;ctrl+鼠标滚轮上下滑&quot;
Nov 17 #Python
Manjaro、pip、conda更换国内源的方法
Nov 17 #Python
pycharm中选中一个单词替换所有重复单词的实现方法
Nov 17 #Python
Pycharm中使用git进行合作开发的教程详解
Nov 17 #Python
python中requests模拟登录的三种方式(携带cookie/session进行请求网站)
Nov 17 #Python
python开发一个解析protobuf文件的简单编译器
Nov 17 #Python
解决python3.x安装numpy成功但import出错的问题
Nov 17 #Python
You might like
PHP网页游戏学习之Xnova(ogame)源码解读(六)
2014/06/23 PHP
php中Session的生成机制、回收机制和存储机制探究
2014/08/19 PHP
CodeIgniter控制器之业务逻辑实例分析
2016/01/20 PHP
js获取图片长和宽度的代码
2009/11/24 Javascript
dropdownlist之间的互相联动实现(显示与隐藏)
2009/11/24 Javascript
JS中处理与当前时间间隔的函数代码
2012/05/23 Javascript
js实现浏览器的各种菜单命令比如打印、查看源文件等等
2013/10/24 Javascript
基于jQuery Circlr插件实现产品图片360度旋转
2015/09/20 Javascript
使用three.js 画渐变的直线
2016/06/05 Javascript
浅谈js中对象的使用
2016/08/11 Javascript
AngularJS控制器详解及示例代码
2016/08/16 Javascript
JS中setTimeout和setInterval的最大延时值详解
2017/02/13 Javascript
JS闭包可被利用的常见场景小结
2017/04/09 Javascript
vue 2.0封装model组件的方法
2017/08/03 Javascript
详解Vue用自定义指令完成一个下拉菜单(select组件)
2017/10/31 Javascript
4个顶级JavaScript高级文本编辑器
2018/10/10 Javascript
简单说说angular.json文件的使用
2018/10/29 Javascript
vue登录以及权限验证相关的实现
2019/10/25 Javascript
element-ui 文件上传修改文件名的方法示例
2019/11/05 Javascript
Javascript中window.name属性详解
2020/11/19 Javascript
python+pyqt实现右下角弹出框
2017/10/26 Python
Python中的单行、多行、中文注释方法
2018/07/19 Python
Python可变和不可变、类的私有属性实例分析
2019/05/31 Python
Python 等分切分数据及规则命名的实例代码
2019/08/16 Python
jupyter notebook参数化运行python方式
2020/04/10 Python
Django与AJAX实现网页动态数据显示的示例代码
2021/02/24 Python
伦敦最著名的老字号百货公司:Selfridges(塞尔福里奇百货)
2016/07/25 全球购物
英国最全面的橄榄球联盟门票网站:Live Rugby Tickets
2018/10/06 全球购物
农业局学习党的群众路线教育实践活动心得体会
2014/03/07 职场文书
群众路线教育实践活动整改方案(个人版)
2014/10/25 职场文书
班级元旦晚会开幕词
2015/01/29 职场文书
倡议书的格式写法
2015/04/28 职场文书
《水上飞机》教学反思
2016/02/20 职场文书
CSS3实现的3D隧道效果
2021/04/27 HTML / CSS
关于Python中进度条的六个实用技巧分享
2022/04/05 Python
python使用opencv对图像添加噪声(高斯/椒盐/泊松/斑点)
2022/04/06 Python