概念
将数据库的东西通过ORM的映射取出来,通过view和serializers文件绑定REST接口,当前端请求时,返回序列化好的json。利用DRF框架快速的实现RestAPI接口的设计,大大提高RestAPI接口开发效率。
DRF是Django的超集,去掉了模板的部分,提供了一个REST的接口,同时也提供了满足该接口的代码工作流。同时,在REST的规范下,升级了权限和分页等功能,增加了限流和过滤搜索等功能。
安装、配置
pip install django-rest-framework
INSTALLED_APPS = [
······
'rest_framework',
]
RestAPI接口
REST
Representational State Transfer: 资源的表现层状态转换一切皆是资源
每一个资源的每一个状态都应该有唯一的操作方式- POST 增加资源
- GET 请求资源
- PUT 修改资源
- DELETE 删除资源
RestAPI接口核心工作
1.将数据库数据序列化为前端所需要的格式,并返回
2.将前端发送的数据反序列化为模型类对象,并保存到数据库中
序列化器
Serializer 功能:进行数据的序列化和反序列化,继承自serializers.Serializer
创建序列化器
app目录下新建一个文件serializers.py,因为是做序列化,而序列化是针对模型的,所以需要跟模型文件models.py在同一个目录下
1 | class BookInfoSerializer(serializers.ModelSerializer): |
model 指明该序列化器处理的数据字段从模型类BookInfo参考生成
fields 指明该序列化器包含模型类中的哪些字段,’all‘指明包含所有字段
** 定义视图路由 **
1 | router = DefaultRouter() # 可以处理视图的路由器 |
序列化
1)序列化单个对象
1 | book = BookInfo.objects.get(id=1) |
2)序列化多个对象,其实就是添加了一个many参数
1 | books = BookInfo.objects.all() |
3)关联对象的嵌套序列化
1.将关联对象序列化为关联对象的主键
1 | hbook = serializers.PrimaryKeyRelatedField(label='图书',read_only=True) |
2.采用指定的序列化器将关联对象进行序列化
1 | hbook = BookInfoSerializer(label='图书') |
3.将关联对象序列化为关联对象模型类_str_方法的返回值
1 | hbook = serializers.StringRelatedField(label='图书') |
转换成标准Json数据的另一种方式:JSONRenderer().render(serializer.data)
反序列化
1 | data = JSONRenderer().parse(content) |
使用序列化器改写RestAPI接口
1 | class BookListView(View): |
修改后:
1 | class BookListView(View): |
编写序列化验证、创建、更新、保存规则:
1 | from rest_framework import serializers |
在“正向序列化”的时候,CharField字段里的参数都没有作用,只有在“反向序列化”是才会有作用。
Django能自动判断你提交的请求是需要增加,判断的标准是基于ID,如果传入的数据里有ID的话,那么认为你是需要进行修改,没有ID则认为是需要进行创建
补充知识
1 | import subprocess |
跨域问题
模板表单:给表单加 {% csrf_tokne %}
REST 架构,禁用 csrf 功能
1 | from django.views.decorators.csrf import csrf_exempt |