使用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. ABI (应用程序二进制接口)

    http://baike.baidu.com/link?url=ybErtZo0zAB5_P-kKZmT_nd9FdxaAAPqW4jqtwN5Tmu_q8weayOOFOJBrXw1RLbR20sK ...

  2. 机器学习实战之Logistic回归

    Logistic回归一.概述 1. Logistic Regression 1.1 线性回归 1.2 Sigmoid函数 1.3 逻辑回归 1.4 LR 与线性回归的区别 2. LR的损失函数 3. ...

  3. 【JS-Java-EL】JavaScript和Java(EL表达式)引发的 Uncaught SyntaxError: Unexpected token ILLEGAL

    2018.10.14 BUG原因: 在较早期的代码中,容易出现 JS 拼接 HTML 代码字符串的情况.如 // 页面 test.jsp 内部的 JS 代码 // ${} JSP中EL语法,内部为Ja ...

  4. Mybatis-数据插入

    传统jdbc数据插入 1.在Java代码for循环插入 executeUpdate() 2.批处理方法addBatch(Statement.Prestatement) addBatch() execu ...

  5. 交换机基础配置之结合以太通道的vlan设置

    我们将以上面的拓扑图来做实验,建立以太通道,并设置好vlan,将pc1和pc3放在同一vlan,将pc2和pc4放在同一vlan,同一vlan能跨交换机通信 在一切还没布置之前,四台pc机都在同一网段 ...

  6. ethereum(以太坊)(十三)--异常处理/元祖

    pragma solidity ^0.4.4; contract Students{ uint[] data= new uint[](4); address _owner = msg.sender; ...

  7. LInux操作随手笔记

    一.find 的用法 实例 find / -name test.txt 就可以找到这个文件的路径(如果存在). 二.学用vi编辑器,学用rz往linux服务器上面上传文件 linux中rz 和 sz ...

  8. mysql 安装常用命令,卸载不干净等

    安装mysql apt-get install mysql-server apt-get install mysql-client sudo apt-get install libmysqlclien ...

  9. [Bzoj3991]寻宝游戏(dfs序+set)

    Description 题目链接 Solution 用set按dfs序维护当前的宝物序列,那么答案为相邻2个点的距离加上头尾2个的距离 Code #include <cstdio> #in ...

  10. 笔记-python-语法-super

    笔记-python-语法-super 1.      super 1.1.    super起源 首先要理解类的继承和多继承,子类有时需要调用父类的方法, 非绑定方法: class C(B): def ...