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. 精通CSS+DIV网页样式与布局--页面背景

    上篇博客,我们主要简单的总结了CSS的图片效果,我们这回来讲讲CSS如何对网页的背景进行设置,网页的背景是整个网页的重要组成部分,她直接决定了整个网页的风格和色调.这篇博客简单的总结一下如何用CSS来 ...

  2. mysql进阶(二十四)防御SQL注入的方法总结

    防御SQL注入的方法总结 这篇文章主要讲解了防御SQL注入的方法,介绍了什么是注入,注入的原因是什么,以及如何防御,需要的朋友可以参考下. SQL注入是一类危害极大的攻击形式.虽然危害很大,但是防御却 ...

  3. Mybatis源码之Statement处理器PreparedStatementHandler(五)

    PreparedStatementHandler就是调用PreparedStatement来执行SQL语句,这样在第一次执行sql语句时会进行预编译,在接下来执行相同的SQL语句时会提高数据库性能 源 ...

  4. pig 的chararry类型不能用比较运算符comparison operator

    pig 的chararry类型可能是按字段,逐个字段进行比较. element_id 是chararray类型, 语句: no_app_category_mapping = filter no_ele ...

  5. Mybatis逻辑分页原理解析RowBounds

    Mybatis提供了一个简单的逻辑分页使用类RowBounds(物理分页当然就是我们在sql语句中指定limit和offset值),在DefaultSqlSession提供的某些查询接口中我们可以看到 ...

  6. iOS开发的10个知识点

    1.关于关键字volatile 一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了.精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取这 ...

  7. Xcode相关常用快捷键搜集

    command + L:  跳转到指定行     control + i:  格式化代码 command + control + 上/下 在*.h和*.m之间切换. command + control ...

  8. (C++)string类杂记

    本文特记录C++中string类(注意string是一个类)的一些值得注意的地方. string类的实例是以‘\0'结束的吗? 这个问题有时还真容易混淆,因为我们可能会将 C++ 语言中的string ...

  9. Leetcode_62_Unique Paths

    本文是在学习中的总结,欢迎转载但请注明出处:http://blog.csdn.net/pistolove/article/details/43404205 A robot is located at ...

  10. 将studio项目 转换为eclipse项目

    总会有些奇怪的事情,比如,有的人就有将studio项目 转换为eclipse项目的需求 首先,不要因为编译原因而放弃.studio项目是完全可以转换成eclipse的 本站的开源代码板块有很多项目都是 ...