#Django REST framework快速入门
###一.Django REST framework简介
1.在开发REST API的视图中,虽然每个视图具体操作的数据不同,但增、删、改、查的实现流程基本套路化,所以这部分代码也是可以复用简化编写的:
增:校验请求数据 -> 执行反序列化过程 ->保存数据库 ->将保存的对象序列化并返回
删:判断要删除的数据是否存在 -> 执行数据库删除
改:判断要修改的数据是否存在 ->校验请求的数据 -> 执行反序列化过程 ->保存数据库 ->将保存的对象序列化并返回
查:查询数据库 -> 将数据序列化并返回
Django REST framework可以帮助我们简化上述部分的代码编写,大大提高REST API的开发速度
Django REST framework 框架是一个用于构建Web API 的强大而又灵活的工具。
通常简称为DRF框架 或 REST framework。
DRF框架是建立在Django框架基础之上
###二.Django REST framework特点
- 提供了定义序列化器Serializer的方法,可以快速根据 Django ORM 或者其它库自动序列化/反序列化;
- 提供了丰富的类视图、Mixin扩展类,简化视图的编写;
- 丰富的定制层级:函数视图、类视图、视图集合到自动生成 API,满足各种需要;
- 多种身份认证和权限认证方式的支持;
- 内置了限流系统;
- 直观的 API web 界面;
- 可扩展性,插件丰富
###三.Django REST framework安装配置
1.安装
pip install djangorestframework
2.在settings.py的INSTALLED_APPS中添加’rest_framework’。
INSTALLED_APPS = [
'rest_framework',
]
###四.Django REST framework视图序列化与反序列化
1. 定义Serializer类
Django REST framework中的Serializer使用类来定义,须继承自rest_framework.serializers.Serializer。
class BookInfoSerializer(serializers.Serializer):
"""图书数据序列化器"""
id = serializers.IntegerField(label='ID', read_only=True)
name = serializers.CharField(label='名称', max_length=20)
pub_date = serializers.DateField(label='发布日期', required=False)
readcount = serializers.IntegerField(label='阅读量', required=False)
commentcount = serializers.IntegerField(label='评论量', required=False)
image = serializers.ImageField(label='图片', required=False)
模型类BookInfo
class BookInfo(models.Model):
name = models.CharField(max_length=20, verbose_name='名称') #图书名称
pub_date = models.DateField(verbose_name='发布日期') #发布日期
readcount = models.IntegerField(default=0, verbose_name='阅读量') #阅读量
commentcount = models.IntegerField(default=0, verbose_name='评论量') #评论量
is_delete = models.BooleanField(default=False, verbose_name='逻辑删除') #逻辑删除
image = models.ImageField(upload_to='book/', verbose_name='图片', null=True)
#元类信息 : 修改表名
class Meta:
db_table = 'bookinfo' # 指明数据库表名
verbose_name = '图书' # 在admin站点中显示的名称
verbose_name_plural = verbose_name # 显示的复数名称
def __str__(self):
"""定义每个数据对象的显示信息"""
return self.name
2. 创建Serializer对象
Serializer的构造方法为:
Serializer(instance=None, data=empty, **kwarg)
说明:
1)用于序列化时,将模型类对象传入instance参数
2)用于反序列化时,将要被反序列化的数据传入data参数
3)除了instance和data参数外,在构造Serializer对象时,还可通过context参数额外添加数据,如
serializer = AccountSerializer(account, context={'request': request})
3.序列化使用
查询并将数据返回前端
1) 先查询出一个图书对象
from book.models import BookInfo
book = BookInfo.objects.get(id=4)
2) 构造序列化器对象
from book.serializers import BookInfoSerializer
serializer = BookInfoSerializer(book)
3)获取序列化数据
通过data属性可以获取序列化后的数据
serializer.data
{'is_delete': False, 'pub_date': '1987-11-11', 'readcount': 58, 'image': None, 'id': 4, 'commentcount': 24, 'name': '雪山飞狐'}
4)如果要被序列化的是包含多条数据的查询集QuerySet,可以通过添加many=True参数补充说明
books = BookInfo.objects.all()
serializer = BookInfoSerializer(books, many=True)
serializer.data
[OrderedDict([('id', 3), ('name', '笑傲江湖'), ('pub_date', '1995-12-24'), ('readcount', 28), ('commentcount', 18), ('is_delete', False), ('image', None)]), OrderedDict([('id', 4), ('name', '雪山飞狐'), ('pub_date', '1987-11-11'), ('readcount', 58), ('commentcount', 24), ('is_delete', False), ('image', None)]), OrderedDict([('id', 5), ('name', '新射雕英雄传'), ('pub_date', '2000-05-01'), ('readcount', 0), ('commentcount', 0), ('is_delete', False), ('image', None)]), OrderedDict([('id', 7), ('name', 'python入门'), ('pub_date', '2018-05-12'), ('readcount', 0), ('commentcount', 0), ('is_delete', False), ('image', None)]), OrderedDict([('id', 9), ('name', 'python运维'), ('pub_date', '2018-05-12'), ('readcount', 0), ('commentcount', 0), ('is_delete', False), ('image', 'book/1.png')])]
loading…