使用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

最新文章

  1. UDT中epoll对CLOSE状态的处理
  2. 配置Openfire的eclipse项目
  3. Oracle10G无图形安装及升级
  4. 16.iOS APP图标和启动画面尺寸
  5. plsql导入excel时报错:ORA-01036: 非法变量名/编号
  6. Dubbo系列(3)_官方Demo说明
  7. 套接字I/O模型-完成端口IOCP
  8. Linux删除文件夹命令
  9. 关于Qt5 UI设计的一些小知识
  10. USB匹配电阻
  11. 关于python命令在editor里编写与在interpreter里的编写的不同之处
  12. Visual Studio 2012中使用Zen Coding,写html的神器!
  13. Inno Setup入门(十九)&mdash;&mdash;Inno Setup类参考(5)
  14. vue传参
  15. window下安装PIL
  16. 接口自动化python
  17. 加号变空格问题 url参数 post get 请求发送
  18. Mybatis 系列1-环境搭建
  19. 【百度】大型网站的HTTPS实践(二)——HTTPS加密算法介绍
  20. 测试用例文件的存放和创建,对page objeck的理解

热门文章

  1. cocos2d-x 3.0 创建项目
  2. Uva 11384 正整数序列
  3. centos 7jenkin+git 安装
  4. 2018.8.1 Java中的反射和同步详解
  5. C语言中%p,%u,%lu都有什么用处
  6. Python-三元运算符和lambda表达式
  7. mysql中locate和substring函数使用
  8. VisualSVN 4.0.10 破解版 附上破解过程
  9. 短信状态监听 - iOS
  10. MySQL备份工具percona-xtrabackup安装