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 routersfrom 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 serializersfrom 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_404from rest_framework import generics, viewsetsfrom rest_framework.response import Responsefrom rest_framework import permissionsfrom models import Diskfrom 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

时间: 2024-10-08 17:43:24

Djano之写api使用django_rest_framework【海瑞博客】的相关文章

用Qt写软件系列六:博客园客户端的设计与实现(用Fiddler抓包,用CURL提交数据,用htmlcxx解析HTML)

引言 博客园是本人每日必逛的一个IT社区.尽管博文以.net技术居多,但是相对于CSDN这种业务杂乱.体系庞大的平台,博客园的纯粹更得我青睐.之前在园子里也见过不少讲解为博客园编写客户端的博文.不过似乎都是移动端的技术为主.这篇博文开始讲讲如何在PC端编写一个博客园客户端程序.一方面是因为本人对于博客园的感情:另一方面也想用Qt写点什么东西出来.毕竟在实践中学习收效更快. 登录过程分析 登录功能是一个客户端程序比不可少的功能.在组装Http数据包发送请求之前,我们得看看整个登录是怎样一个过程.F

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

网络上一提到python,总会有一些不知道是黑还是粉的人大喊着:python是世界上最好的语言.最近利用业余时间体验了下python语言,并写了个爬虫爬取我csdn上关注的几个大神的博客,然后利用leancloud一站式后端云服务器存储数据,再写了一个android app展示数据,也算小试了一下这门语言,给我的感觉就是,像python这类弱类型的动态语言相比于java来说,开发者不需要分太多心去考虑编程问题,能够把精力集中于业务上,思考逻辑的实现.下面分享一下我此次写爬虫的一下小经验,抛砖引玉

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

写blog的习惯,先在word写了,复制到windows live writer,再发布到博客园.word中的文章,图片有缩放比例,复制到windows live writer后图片变得不清晰.除了一张一张 设置图片缩放比例为100%外,再复制到windows live writer.这样做太麻烦.就百度了下面的解决办法. word中图片小,复制出来的就不清楚,你需要设置图片大小为原始大小,复制到windows live writer图片才可能清楚. 还需要设置Windows live writ

开始写几篇自己的博客

10月28日,万维网联盟(W3C)宣布HTML5标准最终制定完成并对外发布,这对于HTML5来说有着里程碑似的意义.作为国内首款 HTML5 开源前端框架,Amaze UI 也在同一天发布了1.0正式版. Amaze UI 在今年7月内测,8月正式开源,9月10月产品迭代,到10月底发布1.0正式版,感谢一路陪伴的朋友.同时告诉大家,Amaze UI 2.0 将采用 jQuery 哦~ 完整更新记录可见:GitHub Amaze UI 是一个针对 HTML 5 开发的轻量级.模块化.移动优先的跨

【小飞牛】记忆留住深刻过往,博客写出平淡事迹【博客首篇】

在记忆的长河中检索,很多知识早已模糊不清:很多事物,早已烟消云散.在曾经流逝的时间里面,自己有过对新知识掌握的喜悦, 有对新事物认知的感动.而如今,那些曾经有的还是没有得,都得靠搜索引擎来解决的时候.我发现自己貌似开始迷失了. 即使知道自己没有惟妙惟肖得文笔,也没有绘声绘色的言语.但是也不能阻止记下曾经学习过的一切. 不求给别人带来什么,至少能够给自己留下些什么. 欢迎有朋友加微信公众号[小飞牛]交流. 编程没改变世界的时候,先改变了你我. 我也希望自己学到的,能和大家一起分享.

[2015更新]用Word2007写CSDN博客

搞了半天终于可以用word2007发布CSDN博客了,特分享出来,以方便其他用户. 启动word2007后,点击左上角的office按钮,并将鼠标指向"发布",得到如图1所示的界面. ? ? 图1 office按钮 然后点击"博客",此时如果没有注册账号会弹出注册账号对话框,如果已经有账号直接进入博客文章页面,点击图2所示的管理账号,然后点击"新建"也可以进入图3所示的注册账号对话框. ? ? 图2?博客文章 ? ? 图3?新建博客账号 在新建博

关于写博客,看博客

每次看到很多人坚持写那么多的好博客,我都会产生怎么自己不写博客的想法.于是乎,在激情的驱使下就会随手写几段文字,然后就不了了之了. 今天又看了cici珵的博客(北大cs本科,博士,美女),再次萌生了写自己的博客的想法. (似乎又要开始写自己这个人怎么怎么样,兴趣广泛,但是做事情不够努力:目标很多,但是不能坚持去做,这些对个人的分析了.反正每次真正着手做一件事情之前总是想分析一下之前怎么怎么做的不好.) 关于cici珵,是昨天刷知乎,看到覃超(覃超大魔王)的知乎专栏文章,关于楼教主从google离

如何写出高质量的技术博客 这边文章出自http://www.jianshu.com/p/ae9ab21a5730 觉得不错直接拿过来了 好东西要大家分享嘛

    如何写出高质量的技术博客?答案是:如果你想,就一定能写出高质量的技术博客.看起来很唯心,但这就是事实.有足够愿力去做一件目标明确,有良好反馈系统的事情往往很简单.就是不停地训练,慢慢地,你自己就能找出规律和技巧.所以,要写出高质量的技术博客,首先要解决为什么要写的问题. 为什么要写 我一直很喜欢的一个学习方法是 Learning by teaching 一个课题,如果你能给不懂的人解释清楚,说明你对这个课题的理解足够深入.把一个课题展开来写,你可能会发现某些方面你还写不清楚,这往往说明你

用Onenote写博客日志

进入OneNote,选中要发布博客的分区,然后点击菜单栏中的[文件]->[发送]->[发送至博客] 这时候会启动word程序弹出下面的对话框(如果你从未设置过),点击[立即注册] 设置参数 API 选择 :MetaWebLog 博客文章URL:http://os.blog.163.com/word/   (所有用户都使用这个地址) 用户名:你的博客用户名 密码:输入你的博客密码 点击确定即可(图片选项可以不设置,默认就行) word中的操作 发布成功后在博客中可以查看 备注: 这几天试验了新浪