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列表与元组详解实例
Nov 01 Python
python 生成器生成杨辉三角的方法(必看)
Apr 10 Python
python 接口返回的json字符串实例
Mar 27 Python
Python正则表达式指南 推荐
Oct 09 Python
python开发游戏的前期准备
May 05 Python
pandas.DataFrame的pivot()和unstack()实现行转列
Jul 06 Python
使用python实现数组、链表、队列、栈的方法
Dec 20 Python
Python的形参和实参使用方式
Dec 24 Python
简单了解python filter、map、reduce的区别
Jan 14 Python
关于Tensorflow 模型持久化详解
Feb 12 Python
Python基础教程(一)——Windows搭建开发Python开发环境
Jul 20 Python
Python各协议下socket黏包问题原理
Apr 12 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
用函数读出数据表内容放入二维数组
2006/10/09 PHP
PHP使用递归方式列出当前目录下所有文件的方法
2015/06/02 PHP
[原创]解决wincache不支持64位PHP5.5/5.6的问题(提供64位wincache下载)
2016/06/22 PHP
php实现批量上传数据到数据库(.csv格式)的案例
2017/06/18 PHP
JQUERY对单选框(radio)操作的小例子
2013/04/25 Javascript
举例详解Python中smtplib模块处理电子邮件的使用
2015/06/24 Javascript
jQuery实现Flash效果上下翻动的中英文导航菜单代码
2015/09/22 Javascript
深入理解Angular2 模板语法
2016/08/07 Javascript
原生的强大DOM选择器querySelector介绍
2016/12/21 Javascript
Bootstrap与Angularjs的模态框实例代码
2017/08/03 Javascript
Angular中管道操作符(|)的使用方法
2017/12/15 Javascript
JavaScript中的一些隐式转换和总结(推荐)
2017/12/22 Javascript
JavaScript 高性能数组去重的方法
2018/09/20 Javascript
JS实现的排列组合算法示例
2019/07/16 Javascript
5分钟快速看懂ES6中的反射与代理
2019/12/19 Javascript
angular中的post请求处理示例详解
2020/06/30 Javascript
python列表操作实例
2015/01/14 Python
python 简单的多线程链接实现代码
2016/08/28 Python
Python cookbook(数据结构与算法)字典相关计算问题示例
2018/02/18 Python
简单谈谈Python的pycurl模块
2018/04/07 Python
Python根据成绩分析系统浅析
2019/02/11 Python
django将数组传递给前台模板的方法
2019/08/06 Python
python读写csv文件的方法
2019/08/13 Python
Python利用matplotlib绘制约数个数统计图示例
2019/11/26 Python
Python命令行参数argv和argparse该如何使用
2021/02/08 Python
英国男女奢华内衣和泳装购物网站:Figleaves
2017/01/28 全球购物
Boston Proper官网:美国女装品牌
2017/10/30 全球购物
欧洲当代手工玻璃和瓷器的领先品牌:LSA International
2018/06/03 全球购物
计算机操作自荐信
2013/12/07 职场文书
岗位竞聘演讲稿
2014/01/10 职场文书
运动会广播稿400字
2014/01/25 职场文书
便利店投资创业计划书
2014/02/08 职场文书
中专生自荐信
2014/06/25 职场文书
项目经理助理岗位职责
2015/04/13 职场文书
redis实现排行榜功能
2021/05/24 Redis
Java基础之线程锁相关知识总结
2021/06/30 Java/Android