使用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【海瑞博客】的更多相关文章

  1. python 之发送邮件服务[原著] 海瑞博客

    Python 发送邮件 使用默认的django的发送邮件,只适用于单邮箱. 作者:海瑞博客 http://www.hairuinet.com/ setting中配置 # send e-mail EMA ...

  2. Redis C客户端API - God's blog - 博客频道 - CSDN.NET

    Redis C客户端API - God's blog - 博客频道 - CSDN.NET Redis安装步骤: 1.redis server安装 wget http://redis.googlecod ...

  3. 开始写自己的iOS技术博客了

    2015-09-26 中秋节前夕,开始写自己的iOS开发相关的技术博客,还请广大专业的人士批评指教!欢迎纠错和交流! 在来到北京的第二家公司艾亿新融资本管理的子公司——资配易.由于基本没有加班,也算有 ...

  4. 写了几天的博客-feel

    写博客 真的总结我自己的知识.长见识了.记录下自己遇到的东西,算是一个总结,有问题了,还可以回头看一下.很好 真的很好.

  5. 写带有清晰图片的博客:如何将word中的图片复制到windows live writer保持大小不变--清晰度不变

    写blog的习惯,先在word写了,复制到windows live writer,再发布到博客园.word中的文章,图片有缩放比例,复制到windows live writer后图片变得不清晰.除了一 ...

  6. Hello Python!用 Python 写一个抓取 CSDN 博客文章的简单爬虫

    网络上一提到 Python,总会有一些不知道是黑还是粉的人大喊着:Python 是世界上最好的语言.最近利用业余时间体验了下 Python 语言,并写了个爬虫爬取我 csdn 上关注的几个大神的博客, ...

  7. 推荐一个Java设计模式写的很好的博客

    博客地址:https://quanke.gitbooks.io/design-pattern-java/%E9%9D%A2%E5%90%91%E5%AF%B9%E8%B1%A1%E8%AE%BE%E8 ...

  8. 写个js获取2019博客之星投票活动的名次与投票数

    获取投票数 // app.jsvar request = require('request');var cheerio = require('cheerio');request('http://m23 ...

  9. [2015更新]用Word2007写CSDN博客

    搞了半天终于可以用word2007发布CSDN博客了,特分享出来,以方便其他用户. 所示的界面.     图1 office按钮 所示的管理账号,然后点击"新建"也可以进入图3所示 ...

随机推荐

  1. 设有三个进程A、B、C,其中A与B构成一对生产者与消费者(A为生产者,B为消费者),共享一个由n个缓冲块组成的缓冲池;B与C也构成一对生产者与消费者(此时B为生产者,C为消费者)共享另一个由m个缓冲块组成的缓冲池。用P、V操作描述它们之间的同步关系。

    生产者消费者问题 设信号量mutex1, mutex2, full1, full2, empty1, empty2分别表示1和2号缓冲区的访问互斥, 是否满, 是否空 semaphore mutex1 ...

  2. redis hash类型

  3. vim 中的":wq"和":x"的区别

    ":x" 和 ":wq" 的区别如下:(1) :wq 强制性写入文件并退出(存盘并退出 write and quite).即使文件没有被修改也强制写入,并更新文 ...

  4. R 语言爬虫 之 cnblog博文爬取

    Cnbolg Crawl a). 加载用到的R包 ##library packages needed in this case library(proto) library(gsubfn) ## Wa ...

  5. face verification

    一直没怎么思考过人脸应用上cnn是怎么回事,也曾经想当然过.这两天看些文章,才明白思路. 在人脸verification上,cnn起到的是一个特征提取作用,通过cnn提取得到features,基于这些 ...

  6. mac 开机白屏,卡进度条,无法进入系统

    几个月前我的老Mac又一次的坏掉了,现在想起来就记录一下,哎,话说Apple的东西吧,好用是好用,一般都不会坏,质量保证,但是如果一旦坏了,那就是大问题!(坏了第一时间就应该打电话给apple客服小姐 ...

  7. 03-UI控件浏览

    UI控件浏览 可能用得上的UI控件 为了便于开发者打造各式各样的优秀app,UIKit框架提供了非常多功能强大又易用的UI控件 下面列举一些在开发中可能用得上的UI控件(红色表明最常用,蓝色代表一般, ...

  8. ES6 extends继承及super使用读书笔记

    extends 继承 extends 实现子类的继承 super() 表示父类的构造函数, 子类必须在 constructor中调用父类的方法,负责会报错. 子类的 this 是父类构造出来的, 再在 ...

  9. Python 初始—(列表)

    列表切片 数组data=[a,b,c,d,e] print(data[1,3])#取出b,c , 如果用-号切片则是反向取数,那么去取出来的数为data[-3,-1],如果是0则默认不填 列表追加 d ...

  10. (排班表一)使用SQL语句使数据从坚向排列转化成横向排列

    知识重点: 1.extract(day from schedule01::timestamp)=13 Extract 属于 SQL 的 DML(即数据库管理语言)函数,同样,InterBase 也支持 ...