Djano之写api使用django_rest_framework【海瑞博客】
使用django rest framework 可以更快速和友好的编写api,当然网上有很多教程,对于高手来说相对很简单,对于新手来说,根本搞不明白。那是你没有搞明白你自己的职责,做为后端,我们只要提供接口即可,根据提供的参数,对于返回数据。所以,我们需要友好的返回数据并有说明。
官方网站:
http://www.django-rest-framework.org/
中文教程:
Django-REST-framework教程中文版.pdf
OK 开始学习吧!
首先Model
class Disk(models.Model):
"""
"""
identify = models.CharField(max_length=64)
description = models.CharField(max_length=64, default=u'500G*2')
orgid = models.CharField(max_length=24) def __unicode__(self):
return "%s" % self.description class Meta:
unique_together = ('identify', 'orgid')
urls写法
from rest_framework import routers
from django.conf.urls import url, include # 创建路由对象
router = routers.DefaultRouter()
# 将url 注册到路由对象中
router.register(r'assets/(?P<orgid>\d+)', views.AssetViewSet) # 第一个url 就是我们正常的就可以了,后面2个必须是这种写法,一个字都不能错的
urlpatterns = [
url(r'^assets/(?P<orgid>\d+)/upload$', fileviews.AssetUploadViewSet.as_view()),
url(r'^', include(router.urls)),
url(r'^api-auth/', include('rest_framework.urls', namespace='rest_framework')),
]
创建一个serializers.py
from rest_framework import serializers
from models import Disk class DiskSerializer(serializers.ModelSerializer):
def validate(self, data):
"""
数据验证并保证数据的一致性
"""
if not data['identify'] or not data['orgid']:
raise serializers.ValidationError("Must have fields: identify, orgid") if data['identify']:
if Disk.objects.filter(identify=data['identify'], orgid=data['orgid']):
raise serializers.ValidationError("Data is duplicated")
return data def create(self, validated_data):
‘’‘新建’‘’
disk_obj = Disk.objects.create(**validated_data)
return disk_obj def update(self, instance, validated_data):
'''更新'''
instance.identify = validated_data.get('identify', instance.identify)
instance.description = validated_data.get('description', instance.description)
instance.orgid = validated_data.get('orgid', instance.orgid)
instance.save() return instance class Meta:
model = Disk
fields = "__all__"
views写法
from django.shortcuts import render, get_object_or_404, get_list_or_404
from rest_framework import generics, viewsets
from rest_framework.response import Response
from rest_framework import permissions
from models import Disk
from serializers import DiskSerializer class DiskViewSet(viewsets.ModelViewSet):
"""
硬盘的views
"""
queryset = Disk.objects.all()
serializer_class = DiskSerializer
permission_classes = (permissions.IsAuthenticatedOrReadOnly,) def list(self, request, *args, **kwargs):
'''
返回所有数据列表,get
'''
orgid = self.kwargs['orgid']
self.queryset = Disk.objects.filter(orgid=orgid)
serializer = DiskSerializer(self.queryset, many=True)
return Response({
"status": 0,
"data": serializer.data,
"msg": ""
}) def retrieve(self, request, *args, **kwargs):
'''条件查询'''
orgid = self.kwargs['orgid']
pk = self.kwargs['pk']
liaison = get_object_or_404(self.queryset, identify=pk, orgid=orgid)
serializer = DiskSerializer(liaison) return Response({
"status": 0,
"data": serializer.data,
"msg": ""
}) def create(self, request, *args, **kwargs):
'''创建数据列表 post的时候走此方法'''
orgid = self.kwargs['orgid']
request.data.update({'orgid': orgid})
if Disk.objects.filter(identify=request.data['identify'], orgid=orgid).count() == 0:
serializer = DiskSerializer(data=request.data)
serializer.is_valid(raise_exception=True)
self.perform_update(serializer)
return Response({
"status": 0,
"data": "",
"msg": "create Disk liaison success"
})
return Response({
"status": 1,
"data": "",
"msg": " Disk liaison existed"
}) def update(self, request, *args, **kwargs):
'''更新数据,put'''
partial = kwargs.pop('partial', False)
orgid = self.kwargs['orgid']
pk = self.kwargs['pk']
instance = get_object_or_404(self.queryset, identify=pk, orgid=orgid)
serializer = self.get_serializer(instance, request.data, partial=partial)
serializer.is_valid(raise_exception=True)
self.perform_update(serializer)
return Response({
"status": 0,
"data": serializer.data,
"msg": ""
}) def destroy(self, request, *args, **kwargs):
'''数据'''
partial = kwargs.pop('partial', False)
orgid = self.kwargs['orgid']
pk = self.kwargs['pk']
instance = get_object_or_404(self.queryset, identify=pk, orgid=orgid)
self.perform_destroy(instance) return Response({
"status": 0,
"data": "",
"msg": "delete Memory liaison success"
})
我们来说说我们关心的问题
第一:我们get带的参数去哪去取?
在get请求都是获取数据,那我们传的数据都在request对象中,request与Django自己的不一样,rest的request将数据封装到了 request.query_params,属性中,可以使用get获取。
第二:url的参数动态值怎么取?
在请求中,我们传的值都在**kwargs里,直接获取即可,记得用get。
想查看更多内容,请访问 http://www.hairuinet.com
Djano之写api使用django_rest_framework【海瑞博客】的更多相关文章
- python 之发送邮件服务[原著] 海瑞博客
Python 发送邮件 使用默认的django的发送邮件,只适用于单邮箱. 作者:海瑞博客 http://www.hairuinet.com/ setting中配置 # send e-mail EMA ...
- Redis C客户端API - God's blog - 博客频道 - CSDN.NET
Redis C客户端API - God's blog - 博客频道 - CSDN.NET Redis安装步骤: 1.redis server安装 wget http://redis.googlecod ...
- 开始写自己的iOS技术博客了
2015-09-26 中秋节前夕,开始写自己的iOS开发相关的技术博客,还请广大专业的人士批评指教!欢迎纠错和交流! 在来到北京的第二家公司艾亿新融资本管理的子公司——资配易.由于基本没有加班,也算有 ...
- 写了几天的博客-feel
写博客 真的总结我自己的知识.长见识了.记录下自己遇到的东西,算是一个总结,有问题了,还可以回头看一下.很好 真的很好.
- 写带有清晰图片的博客:如何将word中的图片复制到windows live writer保持大小不变--清晰度不变
写blog的习惯,先在word写了,复制到windows live writer,再发布到博客园.word中的文章,图片有缩放比例,复制到windows live writer后图片变得不清晰.除了一 ...
- Hello Python!用 Python 写一个抓取 CSDN 博客文章的简单爬虫
网络上一提到 Python,总会有一些不知道是黑还是粉的人大喊着:Python 是世界上最好的语言.最近利用业余时间体验了下 Python 语言,并写了个爬虫爬取我 csdn 上关注的几个大神的博客, ...
- 推荐一个Java设计模式写的很好的博客
博客地址:https://quanke.gitbooks.io/design-pattern-java/%E9%9D%A2%E5%90%91%E5%AF%B9%E8%B1%A1%E8%AE%BE%E8 ...
- 写个js获取2019博客之星投票活动的名次与投票数
获取投票数 // app.jsvar request = require('request');var cheerio = require('cheerio');request('http://m23 ...
- [2015更新]用Word2007写CSDN博客
搞了半天终于可以用word2007发布CSDN博客了,特分享出来,以方便其他用户. 所示的界面. 图1 office按钮 所示的管理账号,然后点击"新建"也可以进入图3所示 ...
随机推荐
- 解决Jenkins的错误“The Server rejected the connection: None of the protocols were accepted”
1. 配置节点,配置好节点后,在节点机上运行已下载文件,双击执行,提示"The Server rejected the connection: None of the protocols w ...
- vue中的js动画与Velocity.js结合
vue里面除了用css写动画,还可以用js写动画,vue的transition中,定义了几个动画钩子 第一个动画钩子:@before-enter <div id='app'> <tr ...
- How To Secure Nginx with Let's Encrypt on Ubuntu 14.04
https://www.digitalocean.com/community/tutorials/how-to-secure-nginx-with-let-s-encrypt-on-ubuntu-14 ...
- SpringMVC3中返回json字符串时500 Internal Server Error的处理方案
搭建 Spring3+MyBatis+Rest+BootStrap+JBPM项目环境后,测试发现了一个操蛋的问题.使用Spring MVC的自动类型转换为JSON时,后台数据List/Map获取完全正 ...
- Win10预览版激活信息
微软在10月2日零点正式公开了Win10预览版的下载地址,这个时间大家应该逐步开始安装工作了,因此提出下面两个问题的用户特别多,IT之家再稍作告知一下.1.Win10预览版安装密钥是什么?答:NKJF ...
- SqlServer和Oracle修改表结构语句
SQL Server:1.增加列 ALTER TABLE users ADD address varchar(30);2.删除列 ALTER TABLE users DROP COLUMN add ...
- LeetCode706. Design HashMap
题目 不使用任何内建的哈希表库设计一个哈希映射 具体地说,你的设计应该包含以下的功能 put(key, value):向哈希映射中插入(键,值)的数值对.如果键对应的值已经存在,更新这个值. get ...
- OA上传和编辑数据
1.VO:value object值对象.通常用于业务层之间的数据传递,和PO一样也是仅仅包含数据而已.但应是抽象出的业务对象,可以和表对应,也可以不,这根据业务的需要. 2. String[]类型打 ...
- LVS基于NAT模式搭建负载均衡群集
LVS的基本架构图 负载均衡群集中,包括三个层次的组件: 1.第一层,负载调度器(BL) 前段至少有一个负载调度器(Load Balancer 或称为Director)负责响应并分发来自客户端的访问请 ...
- JDK5 新特性
JDK5新特性目录导航: 自动拆装箱 Foreach 静态导入 可变参数 Var args 枚举 格式化输出 泛型 ProcessBuilder 内省 线程并发库(JUC) 监控和管理虚拟机 元数据 ...