DjangoRestFramework实践笔记
1、Restful服务的实现方式一共三种:function based view,class based view,viewset+router,这三种实现方式的封装重度依序升高,越往后越适合典型CURD服务,因为我们的产品是互联网产品,服务接口大多数是业务操作,所以主要以function based view为主,偶尔使用class based view。
2、序列化器Serializer的使用,序列化器在输入处理中类似Form,实际是反序列化的作用。同时对输出数据的格式有所定制,真正的序列化定制。当然序列化要想完整使用,就要用modal序列化器,而这个序列化器要直接使用需要是RDB存储,这在如今这个NoSQL盛行的时代,有所约束,不过也算好了。
3、基本配置
- REST_FRAMEWORK = {
- 'DEFAULT_PARSER_CLASSES': (
- 'rest_framework.parsers.JSONParser',#主要使用JSon解析器
- ),
- 'DEFAULT_AUTHENTICATION_CLASSES': (
- 'rest_framework.authentication.TokenAuthentication',#for Restful服务验证
- 'rest_framework.authentication.SessionAuthentication',#for 自动生成文档页面的验证
- ),
- 'DEFAULT_PERMISSION_CLASSES': (
- 'rest_framework.permissions.IsAuthenticated',#所有view的默认认证
- )
- }
4、form文件上传问题,默认使用的JSon解析器可能会对multipart的data body有干扰,导致request.Files解析直接失败,给客户端返回415答复,这个时候需要手动给相关view修改解析器,比如如下函数装饰器配置:
- @parser_classes((MultiPartParser,))
5、引用到user的序列化器对user外键字段的输出要格外小心,这个地方有可能连user的密码字段都输出掉,所以引用user的外键,一定要从序列化器的depth设置或者序列化器关系字段定义等方式上,让user的输出符合你的要求。
6、Field的定制,Field的定制化改写方式是改写to_representation或to_internal_value,前者负责把变量转化成字符串,后者负责把字符串转化成变量,我们这个项目中的FileField为了输出完整路径,改写了to_representation方法:
- class TFileField(serializers.FileField):
- def to_representation(self, obj):
- if not obj:
- return None
- if obj.name.find("/static/") == 0:
- return MEDIA_DOMAIN + obj.name
- else:
- return MEDIA_DOMAIN + "/static/" + obj.url
7、Serializer的定制化改写,我说一个我的改写场景,某对象的聚合对象的属性需要和主对象属性并列,这个采用官方Serializer的特性只能做到一个外键ID属性并列,其他属性都不可以,于是可以改写Serializer的to_representation如下:
- def to_representation(self, instance):
- ret = super(ContactSerializer,self).to_representation(instance)
- ret["username"] = instance.user.username
- return ret
8、调用序列化对象的save时报错:
- 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、应用加载不完全错误:错误提示:
- AttributeError: type object 'Token' has no attribute 'objects'
错误原因,Token所在的应用'rest_framework.authtoken'没有加在INSTALLED_APPS配置里面,加上即可解决问题。
DjangoRestFramework实践笔记的更多相关文章
- hadoop2.5.2学习及实践笔记(二)—— 编译源代码及导入源码至eclipse
生产环境中hadoop一般会选择64位版本,官方下载的hadoop安装包中的native库是32位的,因此运行64位版本时,需要自己编译64位的native库,并替换掉自带native库. 源码包下的 ...
- Python编程从入门到实践笔记——异常和存储数据
Python编程从入门到实践笔记——异常和存储数据 #coding=gbk #Python编程从入门到实践笔记——异常和存储数据 #10.3异常 #Python使用被称为异常的特殊对象来管理程序执行期 ...
- Python编程从入门到实践笔记——文件
Python编程从入门到实践笔记——文件 #coding=gbk #Python编程从入门到实践笔记——文件 #10.1从文件中读取数据 #1.读取整个文件 file_name = 'pi_digit ...
- Python编程从入门到实践笔记——类
Python编程从入门到实践笔记——类 #coding=gbk #Python编程从入门到实践笔记——类 #9.1创建和使用类 #1.创建Dog类 class Dog():#类名首字母大写 " ...
- Python编程从入门到实践笔记——函数
Python编程从入门到实践笔记——函数 #coding=gbk #Python编程从入门到实践笔记——函数 #8.1定义函数 def 函数名(形参): # [缩进]注释+函数体 #1.向函数传递信息 ...
- Python编程从入门到实践笔记——用户输入和while循环
Python编程从入门到实践笔记——用户输入和while循环 #coding=utf-8 #函数input()让程序暂停运行,等待用户输入一些文本.得到用户的输入以后将其存储在一个变量中,方便后续使用 ...
- Python编程从入门到实践笔记——字典
Python编程从入门到实践笔记——字典 #coding=utf-8 #字典--放在{}中的键值对:跟json很像 #键和值之间用:分隔:键值对之间用,分隔 alien_0 = {'color':'g ...
- Python编程从入门到实践笔记——if语句
Python编程从入门到实践笔记——if语句 #coding=utf-8 cars=['bwm','audi','toyota','subaru','maserati'] bicycles = [&q ...
- Python编程从入门到实践笔记——操作列表
Python编程从入门到实践笔记——操作列表 #coding=utf-8 magicians = ['alice','david','carolina'] #遍历整个列表 for magician i ...
随机推荐
- 精通CSS+DIV网页样式与布局--页面背景
上篇博客,我们主要简单的总结了CSS的图片效果,我们这回来讲讲CSS如何对网页的背景进行设置,网页的背景是整个网页的重要组成部分,她直接决定了整个网页的风格和色调.这篇博客简单的总结一下如何用CSS来 ...
- mysql进阶(二十四)防御SQL注入的方法总结
防御SQL注入的方法总结 这篇文章主要讲解了防御SQL注入的方法,介绍了什么是注入,注入的原因是什么,以及如何防御,需要的朋友可以参考下. SQL注入是一类危害极大的攻击形式.虽然危害很大,但是防御却 ...
- Mybatis源码之Statement处理器PreparedStatementHandler(五)
PreparedStatementHandler就是调用PreparedStatement来执行SQL语句,这样在第一次执行sql语句时会进行预编译,在接下来执行相同的SQL语句时会提高数据库性能 源 ...
- pig 的chararry类型不能用比较运算符comparison operator
pig 的chararry类型可能是按字段,逐个字段进行比较. element_id 是chararray类型, 语句: no_app_category_mapping = filter no_ele ...
- Mybatis逻辑分页原理解析RowBounds
Mybatis提供了一个简单的逻辑分页使用类RowBounds(物理分页当然就是我们在sql语句中指定limit和offset值),在DefaultSqlSession提供的某些查询接口中我们可以看到 ...
- iOS开发的10个知识点
1.关于关键字volatile 一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了.精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取这 ...
- Xcode相关常用快捷键搜集
command + L: 跳转到指定行 control + i: 格式化代码 command + control + 上/下 在*.h和*.m之间切换. command + control ...
- (C++)string类杂记
本文特记录C++中string类(注意string是一个类)的一些值得注意的地方. string类的实例是以‘\0'结束的吗? 这个问题有时还真容易混淆,因为我们可能会将 C++ 语言中的string ...
- Leetcode_62_Unique Paths
本文是在学习中的总结,欢迎转载但请注明出处:http://blog.csdn.net/pistolove/article/details/43404205 A robot is located at ...
- 将studio项目 转换为eclipse项目
总会有些奇怪的事情,比如,有的人就有将studio项目 转换为eclipse项目的需求 首先,不要因为编译原因而放弃.studio项目是完全可以转换成eclipse的 本站的开源代码板块有很多项目都是 ...