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学习笔记之os模块使用总结
Nov 03 Python
python批量生成本地ip地址的方法
Mar 23 Python
Python提取Linux内核源代码的目录结构实现方法
Jun 24 Python
解决pycharm下os.system执行命令返回有中文乱码的问题
Jul 07 Python
python 生成器和迭代器的原理解析
Oct 12 Python
python matplotlib如何给图中的点加标签
Nov 14 Python
解决Tensorflow占用GPU显存问题
Feb 03 Python
Python通过4种方式实现进程数据通信
Mar 12 Python
用于ETL的Python数据转换工具详解
Jul 21 Python
python爬虫数据保存到mongoDB的实例方法
Jul 28 Python
python 装饰器的使用示例
Oct 10 Python
Python加载数据的5种不同方式(收藏)
Nov 13 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计算页面执行时间的实现代码
2013/06/18 PHP
PHP加密函数 Javascript/Js 解密函数
2013/09/23 PHP
wordpress安装过程中遇到中文乱码的处理方法
2015/04/21 PHP
浅谈关于PHP解决图片无损压缩的问题
2017/09/01 PHP
PHP CURL与java http使用方法详解
2018/01/26 PHP
JavaScript中的变量声明早于赋值分析
2012/03/01 Javascript
js中array的sort()方法使用介绍
2014/02/20 Javascript
js实现带缓冲效果的仿QQ面板折叠菜单代码
2015/09/06 Javascript
javascript中checkbox使用方法实例演示
2015/11/19 Javascript
jQuery入门之层次选择器实例简析
2015/12/11 Javascript
移动端 一个简单易懂的弹出框
2016/07/06 Javascript
vue表单绑定实现多选框和下拉列表的实例
2017/08/12 Javascript
Angular js 实现添加用户、修改密码、敏感字、下拉菜单的综合操作方法
2017/10/24 Javascript
vue使用axios实现文件上传进度的实时更新详解
2017/12/20 Javascript
Gulp实现静态网页模块化的方法详解
2018/01/09 Javascript
深入理解Promise.all
2018/08/08 Javascript
vue v-for 使用问题整理小结
2019/08/04 Javascript
微信小程序按钮点击动画效果的实现
2019/09/04 Javascript
JavaScript 实现继承的几种方式
2021/02/19 Javascript
[50:15]VP vs Mineski 2018国际邀请赛淘汰赛BO3 第二场 8.22
2018/08/23 DOTA
浅谈python中scipy.misc.logsumexp函数的运用场景
2016/06/23 Python
Pytorch中Tensor与各种图像格式的相互转化详解
2019/12/26 Python
浅谈opencv自动光学检测、目标分割和检测(连通区域和findContours)
2020/06/04 Python
基于Python中Remove函数的用法讨论
2020/12/11 Python
html5借用repeating-linear-gradient实现一把刻度尺(ruler)
2019/09/09 HTML / CSS
Canon佳能美国官方商店:购买数码相机、数码单反相机、镜头和打印机
2016/11/15 全球购物
世界最大的票务市场:viagogo
2017/02/16 全球购物
西班牙在线光学:Visual-Click
2020/06/22 全球购物
个人职业生涯规划书1500字
2013/12/31 职场文书
临床医师个人自我评价
2014/04/06 职场文书
2015年毕业生自我鉴定模板
2014/09/19 职场文书
立案决定书范文
2015/06/24 职场文书
高中美术教学反思
2016/02/17 职场文书
原来实习报告是这样写的呀!
2019/07/03 职场文书
SpringBoot生成License的实现示例
2021/06/16 Java/Android
Python使用海龟绘图实现贪吃蛇游戏
2021/06/18 Python