介绍:
DRF是以Django扩展应用的方式提供的,所以我们可以直接利用已有的Django环境而无需从新创建。(若没有Django环境,需要先创建环境安装Django)
1.安装DRF
pip install djangorestframework
2. 添加rest_framework应用
创建demo工程,在settings.py的INSTALLED_APPS中添加‘rest_framework’.
INSTALLED_APPS = [
...
'rest_framework',
]
接下来就可以使用DRF进行开发啦~
一、Django REST framework简介
使用场景:用于前后端分离开发;
核心功能:进行大量封装,提高API开发速度
一个拥有构建Web API的的框架,简称DRF或REST framework
1.作用
大大提高REST API接口的开发速度;(因为DRF框架内容封装了很多东西,目的就是简化代码)
因为流程一样的,例如增删改查的序列化与反序列化;
2.开发环境
Django-REST-framework是基于django的,必须在django环境下;
3.特点
-
1.提供了定义序列化器Serializer的方法,可以快速根据Django ORM 或者其他库自动序列化/反序列化
-
2.提供了丰富的类视图\MIXIN扩展类,简化视图的编写
-
3.丰富的定制层级:函数视图\类视图\试图结合到自动生成API,满足各种需要
-
4.多种身份认证和权限认证方式的支持
-
5.内置了限流系统
-
6.直观的API web界面
-
7.可扩展性 , 插件丰富
二、序列化器
1.定义:
序列化:将实例对象转换为字典(DRF框架)view视图的输出,也是写入数据库的操作(json.dumps(data))
把对象(变量)从内存中变成可存储或者传输的过程,在python中叫pickling,序列化之后,就可以把序列化之后的内容存储到磁盘或者通过网络传输到其他机器上。
原因:由于存在于内存中的变量都是暂时的,无法长期驻存,为了把对象的状态保持下来,把变量从内存中变成可存储或传输的过程就叫做序列化,在Python中叫pickling,在其他语言中也被称之为serialization,marshalling,flattening等等。
反序列化: view视图的输入,读取数据库的操作(json.loads(data))
从磁盘中将序列化后的内容读取到内存中 称为unpickling
1) 数据校验
2) 数据保存-新增和更新
常用:作为序列化以及反序列化的几个模块:json pickle shelve
说明:
1.用于序列化时,将实例对象传给insta;
2.用于反序列化时,将要被反序列化的数据传给data参数;
2.定义序列化器类
例如,我们已有了一个数据库模型类BookInfo
class BookInfo(models.Model):
btitle = models.CharField(max_length=20, verbose_name='名称')
bpub_date = models.DateField(verbose_name='发布日期', null=True)
bread = models.IntegerField(default=0, verbose_name='阅读量')
bcomment = models.IntegerField(default=0, verbose_name='评论量')
image = models.ImageField(upload_to='booktest', verbose_name='图片', null=True)
我们想为这个模型类提供一个序列化器,可以定义如下:
class BookInfoSerializer(serializers.Serializer):
"""图书数据序列化器"""
id = serializers.IntegerField(label='ID', read_only=True)
btitle = serializers.CharField(label='名称', max_length=20)
bpub_date = serializers.DateField(label='发布日期', required=False)
bread = serializers.IntegerField(label='阅读量', required=False)
bcomment = serializers.IntegerField(label='评论量', required=False)
image = serializers.ImageField(label='图片', required=False)
注意:serializer不是只能为数据库模型类定义,也可以为非数据库模型类的数据定义。serializer是独立于数据库之外的存在。
选项参数:
参数名称 | 作用 |
---|---|
max_length | 最大长度 |
min_lenght | 最小长度 |
allow_blank | 是否允许为空 |
trim_whitespace | 是否截断空白字符 |
max_value | 最小值 |
min_value | 最大值 |
通用参数:
参数名称 | 说明 |
---|---|
read_only | 表明该字段仅用于序列化输出,默认False |
write_only | 表明该字段仅用于反序列化输入,默认False |
required | 表明该字段在反序列化时必须输入,默认True |
default | 反序列化时使用的默认值 |
allow_null | 表明该字段是否允许传入None,默认False |
validators | 该字段使用的验证器 |
error_messages | 包含错误编号与错误信息的字典 |
label | 用于HTML展示API页面时,显示的字段名称 |
help_text | 用于HTML展示API页面时,显示的字段帮助提示信息 |
通用选项参数:用来提示错误信息的
error_messages = {
'max_value':'最大值为20',
'min_value':最小值为10',
}
创建Serializer对象
定义好Serializer类后,就可以创建Serializer对象了。
Serializer的构造方法为:
Serializer(instance=None, data=empty, **kwarg)
说明:
1)用于序列化时,将模型类对象传入instance参数
2)用于反序列化时,将要被反序列化的数据传入data参数
3)除了instance和data参数外,在构造Serializer对象时,还可通过context参数额外添加数据,如:
serializer = AccountSerializer(account, context={'request': request})
通过context参数附加的数据,可以通过Serializer对象的context属性获取。
2.1 序列化基本操作
a.序列化单个对象操作
序列化器操作
if __name__ == '__main__':
# 用一个对象接受查询单挑的记录
book = BookInfo.objects.get(id=1)
# 使用序列化器类BookInfoSerializer,将接受的参数进行序列化
serializer = BookInfoSerializer(book)
# 接受序列化器数据的对象
res = serializer.data
# 格式化输出,json
res = json.dumps(res, indent=1 , ensure_ascii=False)
print(res)
b.序列化多个对象
序列化器操作
if __name__ == '__main__':
# 用一个对象接受查询单挑的记录
book = BookInfo.objects.get(id=1, maney=True)
# 使用序列化器类BookInfoSerializer,将接受的参数进行序列化
serializer = BookInfoSerializer(book)
# 接受序列化器数据的对象
res = serializer.data
# 格式化输出,json
res = json.dumps(res, indent=1 , ensure_ascii=False)
print(res)
2.2反序列化操作
基本操作:
# 反序列化器--验证操作
# if __name__ == '__main__':
# data = {
# 'btitle': 'python',
# 'bpub_date': '2000-01-01',
# 'bread':20,
# 'bcomment':40,
# }
# # 使用序列化器类
# serializer = BookInfoSerializer(data=data)
#
# # 校验数据
# res = serializer.is_valid() # 主要看数据类型,看看值符合要求不
# print(res)
#
# # 校验之后拿到的数据
# res = serializer.validated_data
# print(res)
# # 如果检验失败报错
# res = serializer.errors
# print(res)
反序列化器-数据保存
条件:
1.必须在校验完成才能save(),
2.在save数据保存是会调用内部的create或者是update方法
Create是实现数据的新增
Update是实现数据的更新
3.创建序列化器对象的时候,如果没有传递instance实例,则调用save()方法的时候,create()被调用;
相反:如果传递了instance 实例,则调用save()方法的时候,update()被调用