# 一、Django REST FrameWork 简介
使用 Django REST FramWork 能够让我们使用 Django 编写的后端 API 接口时,更优雅的处理数据的 json 序列化和 json 反序列化
# 1、DRF 的安装
这里想必学习了 django 的童鞋都应该能够知道通过 python 自带的包管理工具进行安装了吧
命令:
代码语言:javascript复制pip install djangorestframework
随后打开 Django 项目的 setttings.py
文件,将我们下载的 DRF 框架注册到 Django 的 APP 当中,如下:
INSTALL_APPS = {
...
'rest_framework',
}
ok,到这里我们就成功得把 DRF 安装到自己电脑上了!
# 二、序列化器的使用
# 1、介绍
序列化器是 DRF 当中的灵魂,因为有它的存在,能够帮助我们少写非常多的重复性代码,比如,当我们的应用当中有这样一个 Model :
代码语言:javascript复制from django.db import models
class Book(models.Model):
title = models.CharField(max_length=32)
price = models.DecimalField(max_digits=5, decimal_places=2)
pub_date = models.DateField()
在前后端分离的场景下,前端采用 ajax 请求我们的后端接口,尽管 Django 当中已经封装好了 JsonResponse
,但是还是需要我们编写如下的代码才能够将 Python 的对象转成 JSON 数据
data = {
"title":book.title,
"price":book.price,
"pub_date":book.pub_date
}
return JsonResponse(data)
这样虽然能够达到我们的目的,但是一当 model 当中的字段过多时,这就是一件非常糟心的事情了,DRF 就是为了处理这种问题而产生的。
# 2、使用
使用 DRF,我们可以这样编写代码,在对应的 app 目录下,新建一个 serializer.py
文件,在文件当中编写如下代码:
from rest_framework import serializers
class BookSerializer(serializers.Serializer):
title = serializers.CharField(max_length=32)
price = serializers.DecimalField(max_digits=5, decimal_places=2)
pub_date = serializers.DateField()
这样,我们就写好了 DRF 的序列化器,接下来就能够在 views.py
当中使用了,使用的方式如下:
book = serializer.BookSerializer(instance=models.Book.objects.all(), many=True)
接下来使用 DRF 给我们封装好的 Response
对象进行数据的返回即可
from rest_framework.response import Response
这样我们就能够开始使用 DRF 提供的序列化器对我们的之前编写的 views 代码进行改造了
# 三、Request 对象解析
当我们的视图层继承了
DRF
给我们提供的的View
时,DRF
会给我们编写的视图函数传递一个request
对象,该对象是对Django
原生request
对象的封装,同时对获取request
对象中的数据进行了简化,使其更加方便的配合序列化器使用。
# 1、.data 属性
request.data
返回请求体解析后的内容。这类似于标准的 request.POST
和 request.FILES
属性,但是该对象包含有独有的特性:
- 它包含了所有解析后的内容,包括文件类型和非文件类型的输入
- 它支持除了
POST
类型以外的其他HTTP方法的内容解析,意味着你可以访问PUT
和PATCH
类型reqeust的内容 - 它提供REST framework灵活的请求解析,而不单单支持from数据。举例说你可以像处理form数据一样处理JSON数据。 详细信息,参考parsers documentation (opens new window)
# 2、.query_params 属性
该属性使原生的 request.GET
更加具有语义化,这样写能够让开发者编写的代码能够更加容易阅读。
# 四、Respone 对象解析
DRF 中对 Django 原生的 Response 对象进行了封装