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所示 ...
随机推荐
- UVA-147 Dollars---完全背包+打表
题目链接: https://vjudge.net/problem/UVA-147 题目大意: 给定11种面值分别为$100, $50, $20, $10, and $5 notes and $2, $ ...
- Spring Security 之集群Session配置
1. 新建Maven项目 cluster-session 2. pom.xml <project xmlns="http://maven.apache.org/POM/4.0. ...
- HttpServletRequest request 获取form参数的两种方式
@RequestMapping(value="/pay",method = RequestMethod.POST) public String buildRequest(HttpS ...
- C# for语句
一.C# for语句 for语句是C#语言中使用频率最高的循环语句. 1. for语句 语法格式如下: for(initializer; condition; iterator){ embedd ...
- 永久免费开源的卫星地形图地图下载工具更新Somap2.13版本功能更新 更新时间2019年2月22日13:59:05
一.下载地址 最新版本下载地址:SoMap2.13点击此处下载 二.系统自主开发特色功能展示 1.上百种地图随意下载 高德.百度.arcgis.谷歌.bing.海图.腾讯.Openstreet.天地 ...
- java基础 序列化反序列化流 实现Serializable 接口 自动装载序列号到对象文本文件如修改不能反序列化对象文本,除非自定义long型常量 打印流
package com.swift.baseKnowledge; import java.io.File; import java.io.FileInputStream; import java.io ...
- 写给iOS小白的MVVM教程(序)
这几天,需要重构下部分代码,这里简要记录下.但是涉及的技术要点还是很多,所以分为多个篇章叙述.此教程来源于,并将于应用于实践,不做过多的概念性阐释和争论.每个篇章都会附上实际的可执行的代码.因涉及的技 ...
- jquery 筛选元素 (3)
.addBack() 添加堆栈中元素集合到当前集合中,一个选择性的过滤选择器. .addBack([selector]) selector 一个字符串,其中包括一个选择器表达式,匹配当前元素集合,不包 ...
- angular学习之angular-phonecat项目的实现
---恢复内容开始--- AngularJS官方网站提供了一个用于学习的示例项目:PhoneCat.这是一个Web应用,用户可以浏览一些Android手机,了解它们的详细信息,并进行搜索和排序操作. ...
- Spring Cloud 入门 Eureka-Client服务提供
前面文章介绍了如果创建“服务注册中心”,现在创建“服务提供者”,并向服务注册中心注册自己,在服务提供方中尝试着提供一个接口来获取当前所有的服务信息. 先,创建一个基本的Spring Boot应用.命名 ...