1、Restful服务的实现方式一共三种:function based view,class based view,viewset+router,这三种实现方式的封装重度依序升高,越往后越适合典型CURD服务,因为我们的产品是互联网产品,服务接口大多数是业务操作,所以主要以function based view为主,偶尔使用class based view。

2、序列化器Serializer的使用,序列化器在输入处理中类似Form,实际是反序列化的作用。同时对输出数据的格式有所定制,真正的序列化定制。当然序列化要想完整使用,就要用modal序列化器,而这个序列化器要直接使用需要是RDB存储,这在如今这个NoSQL盛行的时代,有所约束,不过也算好了。

3、基本配置

  1. REST_FRAMEWORK = {
  2. 'DEFAULT_PARSER_CLASSES': (
  3. 'rest_framework.parsers.JSONParser',#主要使用JSon解析器
  4. ),
  5. 'DEFAULT_AUTHENTICATION_CLASSES': (
  6. 'rest_framework.authentication.TokenAuthentication',#for Restful服务验证
  7. 'rest_framework.authentication.SessionAuthentication',#for 自动生成文档页面的验证
  8. ),
  9. 'DEFAULT_PERMISSION_CLASSES': (
  10. 'rest_framework.permissions.IsAuthenticated',#所有view的默认认证
  11. )
  12. }

4、form文件上传问题,默认使用的JSon解析器可能会对multipart的data body有干扰,导致request.Files解析直接失败,给客户端返回415答复,这个时候需要手动给相关view修改解析器,比如如下函数装饰器配置:

  1. @parser_classes((MultiPartParser,))

5、引用到user的序列化器对user外键字段的输出要格外小心,这个地方有可能连user的密码字段都输出掉,所以引用user的外键,一定要从序列化器的depth设置或者序列化器关系字段定义等方式上,让user的输出符合你的要求。

6、Field的定制,Field的定制化改写方式是改写to_representation或to_internal_value,前者负责把变量转化成字符串,后者负责把字符串转化成变量,我们这个项目中的FileField为了输出完整路径,改写了to_representation方法:

  1. class TFileField(serializers.FileField):
  2. def to_representation(self, obj):
  3. if not obj:
  4. return None
  5. if obj.name.find("/static/") == 0:
  6. return MEDIA_DOMAIN + obj.name
  7. else:
  8. return MEDIA_DOMAIN + "/static/" + obj.url

7、Serializer的定制化改写,我说一个我的改写场景,某对象的聚合对象的属性需要和主对象属性并列,这个采用官方Serializer的特性只能做到一个外键ID属性并列,其他属性都不可以,于是可以改写Serializer的to_representation如下:

  1. def to_representation(self, instance):
  2. ret = super(ContactSerializer,self).to_representation(instance)
  3. ret["username"] = instance.user.username
  4. return ret

8、调用序列化对象的save时报错:

  1. ValueError: "<Topic: Topic object>" needs to have a value for field "topic" before this many-to-many relationship can be used.

这个错误在form的save操作时也会出,错误原因,一个新对象在未存储前,不能对他的ManyToMany的关系做操作,原因也很简单,ManyToMany需要新对象的ID,方法就是在序列化器的存储前,先对对象本身save一下,这样新对象有了ID,操作就Ok了。

8、应用加载不完全错误:错误提示:

  1. AttributeError: type object 'Token' has no attribute 'objects'

错误原因,Token所在的应用'rest_framework.authtoken'没有加在INSTALLED_APPS配置里面,加上即可解决问题。

DjangoRestFramework实践笔记的更多相关文章

  1. hadoop2.5.2学习及实践笔记(二)—— 编译源代码及导入源码至eclipse

    生产环境中hadoop一般会选择64位版本,官方下载的hadoop安装包中的native库是32位的,因此运行64位版本时,需要自己编译64位的native库,并替换掉自带native库. 源码包下的 ...

  2. Python编程从入门到实践笔记——异常和存储数据

    Python编程从入门到实践笔记——异常和存储数据 #coding=gbk #Python编程从入门到实践笔记——异常和存储数据 #10.3异常 #Python使用被称为异常的特殊对象来管理程序执行期 ...

  3. Python编程从入门到实践笔记——文件

    Python编程从入门到实践笔记——文件 #coding=gbk #Python编程从入门到实践笔记——文件 #10.1从文件中读取数据 #1.读取整个文件 file_name = 'pi_digit ...

  4. Python编程从入门到实践笔记——类

    Python编程从入门到实践笔记——类 #coding=gbk #Python编程从入门到实践笔记——类 #9.1创建和使用类 #1.创建Dog类 class Dog():#类名首字母大写 " ...

  5. Python编程从入门到实践笔记——函数

    Python编程从入门到实践笔记——函数 #coding=gbk #Python编程从入门到实践笔记——函数 #8.1定义函数 def 函数名(形参): # [缩进]注释+函数体 #1.向函数传递信息 ...

  6. Python编程从入门到实践笔记——用户输入和while循环

    Python编程从入门到实践笔记——用户输入和while循环 #coding=utf-8 #函数input()让程序暂停运行,等待用户输入一些文本.得到用户的输入以后将其存储在一个变量中,方便后续使用 ...

  7. Python编程从入门到实践笔记——字典

    Python编程从入门到实践笔记——字典 #coding=utf-8 #字典--放在{}中的键值对:跟json很像 #键和值之间用:分隔:键值对之间用,分隔 alien_0 = {'color':'g ...

  8. Python编程从入门到实践笔记——if语句

    Python编程从入门到实践笔记——if语句 #coding=utf-8 cars=['bwm','audi','toyota','subaru','maserati'] bicycles = [&q ...

  9. Python编程从入门到实践笔记——操作列表

    Python编程从入门到实践笔记——操作列表 #coding=utf-8 magicians = ['alice','david','carolina'] #遍历整个列表 for magician i ...

随机推荐

  1. 给你的流添加缓冲装置——字节块ByteChunk

    这是一个很重要的一个字节数组处理缓冲工具,它封装了字节缓冲器及对字节缓冲区的操作,包括对缓冲区的写入.读取.扩展缓冲区大小等等,另外还提供相应字符编码的转码操作.此工具让缓冲操作变得更加方便,除了缓冲 ...

  2. DB Query Analyzer 6.04 is distributed, 78 articles concerned have been published

        DB Query Analyzer 6.04 is distributed,78 articles concerned have been published  DB Query Analyz ...

  3. 【一天一道LeetCode】#100. Same Tree(100题大关)

    一天一道LeetCode 本系列文章已全部上传至我的github,地址:ZeeCoder's Github 欢迎大家关注我的新浪微博,我的新浪微博 欢迎转载,转载请注明出处 (一)题目 Given t ...

  4. Groovy脚本检查html坏链接

    这些天在搞Gradle翻译,因为原译者在翻译的同时也把文件进行了整理,并且把翻译过的章节放到新的文件夹中,导致可能有些超链接未改正过来变成死链接. 本想在网上找个工具来检查的,百度了几个工具要么太大要 ...

  5. oracle的rownum与having用法 去除重复 在重复情况用rownum

    一般来说,大家会用rownum,也就是伪列来指定要显示多条数据, 比如 select linename from aced where rownum<3 但是,大家注意,如果取出来的数据有重复数 ...

  6. Leetcode_26_Remove Duplicates from Sorted Array

    本文是在学习中的总结,欢迎转载但请注明出处:http://blog.csdn.net/pistolove/article/details/41558551 Remove Duplicates from ...

  7. Eclipse下载GitHub源码

    1. 可以通过Eclipse->File->Import->Project from Git->URI来提取工程   2. 也可以通过打开git仓库视图(Eclipse 自带了 ...

  8. 基于FT5x06嵌入式Linux电容触摸屏驱动

    **************************************************************************************************** ...

  9. (三十四)NavigationController初步

    为了了解底层,首先不基于UIWindow而基于UIWindow来创建App. 由于Xcode6没有以前的基于UIWindow的空项目,所以选择SingleView,然后删除storyboard,移除B ...

  10. Linux 安装python爬虫框架 scrapy

    Linux 安装python爬虫框架 scrapy http://scrapy.org/ Scrapy是python最好用的一个爬虫框架.要求: python2.7.x. 1. Ubuntu14.04 ...