使用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. replace into 浅析

    转载自:http://blog.itpub.net/22664653/viewspace-1669734/ http://blog.itpub.net/22664653/viewspace-16701 ...

  2. Codeforces 758B Blown Garland

    题目链接:http://codeforces.com/contest/758/problem/B 题意:一个原先为4色环的链子少了部分,要你找出死的最少的一种可能,各输出四种颜色的死了多少. 分析:就 ...

  3. 2018年第九届蓝桥杯【C++省赛B组】第二题 明码

    汉字的字形存在于字库中,即便在今天,16点阵的字库也仍然使用广泛.16点阵的字库把每个汉字看成是16x16个像素信息.并把这些信息记录在字节中. 一个字节可以存储8位信息,用32个字节就可以存一个汉字 ...

  4. MySQL游标(cursor) 定义及使用

    概念 游标(Cursor)它使用户可逐行访问由SQL Server返回的结果集. 使用游标(cursor)的一个主要的原因就是把集合操作转换成单个记录处理方式. 用SQL语言从数据库中检索数据后,结果 ...

  5. 第25章 串行FLASH文件系统FatFs—零死角玩转STM32-F429系列

    第25章     串行FLASH文件系统FatFs 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.c ...

  6. C#中 property 与 attribute的区别?

    C#中 property 与 attribute的区别?答:attribute:自定义属性的基类;property :类中的属性

  7. Spring详解篇之IoC控制反转

    ###一.Spring概况 spring是一个开源框架 是一个轻量的控制反转和面向切面的容器框架 大小和开销都是轻量的. 通过控制反转技术可以达到松耦合的目的 切面编程,允许通过分离应用的业务逻辑. ...

  8. Integer和int使用==比较的总结

    public static void main(String[] args) { int i1 = 128; Integer i2 = 128; Integer i3 = new Integer(12 ...

  9. linux下 利用 rz 命令上传文件

    1. 如何安装? 1)编译安装  root 账号登陆后,依次执行以下命令: # cd /tmp # wget http://www.ohse.de/uwe/releases/lrzsz-0.12.20 ...

  10. Javascript简单特效及摘要

    1.js中的Element对象 ** var input1=docuemnt.getElementById("input1"); //alert(input1.value); // ...