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 相关文章推荐
django模型中的字段和model名显示为中文小技巧分享
Nov 18 Python
举例讲解Python程序与系统shell交互的方式
Apr 09 Python
Python使用Selenium模块实现模拟浏览器抓取淘宝商品美食信息功能示例
Jul 18 Python
python如何求解两数的最大公约数
Sep 27 Python
Python数据抓取爬虫代理防封IP方法
Dec 23 Python
Python之循环结构
Jan 15 Python
numpy数组广播的机制
Jul 12 Python
Pycharm 字体大小调整设置的方法实现
Sep 27 Python
Python for循环通过序列索引迭代过程解析
Feb 07 Python
Python socket连接中的粘包、精确传输问题实例分析
Mar 24 Python
jupyter notebook 使用过程中python莫名崩溃的原因及解决方式
Apr 10 Python
python interpolate插值实例
Jul 06 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函数
2010/02/16 PHP
《PHP编程最快明白》第五讲:php目录、文件操作
2010/11/01 PHP
php文档更新介绍
2011/07/22 PHP
在CentOS上搭建LAMP+vsftpd环境的简单指南
2015/08/01 PHP
WordPres对前端页面调试时的两个PHP函数使用小技巧
2015/12/22 PHP
浅谈php中fopen不能创建中文文件名文件的问题
2017/02/06 PHP
Yii 2.0如何使用页面缓存方法示例
2017/05/23 PHP
利用PHPStorm如何开发Laravel应用详解
2017/08/30 PHP
用js实现的检测浏览器和系统的函数
2009/04/09 Javascript
一些经常会用到的Javascript检测函数
2010/05/31 Javascript
window.event快达到全浏览器支持了,以后使用就方便了
2011/11/30 Javascript
js中for in语句的用法讲解
2015/04/24 Javascript
jQuery+css实现炫目的动态块漂移效果
2016/01/28 Javascript
原生JS实现几个常用DOM操作API实例
2017/01/19 Javascript
jQuery实现jQuery-form.js实现异步上传文件
2017/04/28 jQuery
详解Javascript获取缓存和清除缓存API
2017/05/25 Javascript
基于jquery日历价格、库存等设置插件
2020/07/05 jQuery
vue2.0s中eventBus实现兄弟组件通信的示例代码
2017/10/25 Javascript
把vue-router和express项目部署到服务器的方法
2018/02/21 Javascript
vue设置一开始进入的页面教程
2019/10/28 Javascript
[05:49]DOTA2-DPC中国联赛 正赛 Elephant vs LBZS 选手采访
2021/03/11 DOTA
Python统计文件中去重后uuid个数的方法
2015/07/30 Python
Python调用微信公众平台接口操作示例
2017/07/08 Python
Tensorflow 实现修改张量特定元素的值方法
2018/07/30 Python
Python3编码问题 Unicode utf-8 bytes互转方法
2018/10/26 Python
使用Windows批处理和WMI设置Python的环境变量方法
2019/08/14 Python
在django模板中实现超链接配置
2019/08/21 Python
学习python需要有编程基础吗
2020/06/02 Python
Python生成并下载文件后端代码实例
2020/08/31 Python
HTML5实现直播间评论滚动效果的代码
2020/05/27 HTML / CSS
英国领先的珍珠首饰品牌:Orchira
2016/09/11 全球购物
趣天网日本站:Qoo10 JP
2019/09/18 全球购物
软件测试题目
2013/02/27 面试题
MYSQL基础面试题
2012/05/13 面试题
收银员岗位职责
2014/02/07 职场文书
导游词之桂林
2019/08/20 职场文书