其实就是 Django RESTful Framework
RESTful 一种 API 的命名风格, 主要因为前后端分离开发出现
前后端分离: 用户访问静态文件的服务器, 数据全部由 Ajax 请求给到
RESTful 风格: 数据应该是名词, 而动词由 HTTP 的请求方式来体现
RESTful 风格的 API 给前端返回 结果对象, 无论什么请求方式
"' 特点: 反复重复
因为不论什么请求方式, 都需要给前端返回对象内容, 就是 JSON 格式的
所以每次如果有查询的结果对象都需要遍历成字典, 和 flask 相同
如果不是 get 请求是带有内容的请求, 那从前端接收的是 JSON 格式
每次都需要从 request.body 中拿出内容, 是 bytes 格式
然后 decode 解码成 JSON 字符串然后再 loads 成可以给 python 处理的字典
"'"'
说明:
return JsonResponse(book_list, safe=False)
对 safe 的说明, 我们传过去的 book_list 是一个 list 格式
在前端 JSON 支持 {} 格式也支持 [] 格式
但是 django 中认为 [] 的 JSON 格式是不安全的会进行校验
所以把 safe 选项关闭 False, 不进行校验就可以传[]
"'"'
序列化: 对查询结果进行遍历, 然后转成字典, 给到 JsonResponse
反序列化: 接收前端 JSON 处理成字典, 然后校验
"'"'
1.DRF 框架工程搭建, 建立在 django 的基础上
安装 DRF: pip install djangorestframework
注册 DRF: INSTALLED_APPS = ['rest_framework',]
在子应用中 serializers.py 创建序列化器, 用于执行序列化和反序列化
在 views 中类视图使用序列化器, 在 urls 中写地址
"'"'
2. 序列化器: serializer
定义: 其实 ModelSerializer 是 Serializer 的子类, 更方便有模型类的序列化器的创建, 实际产生的序列化器如下
class BookInfoSerializer(serializers.Serializer): 实际继承 Serializer
"""图书数据序列化器""" 序列化器: 执行序列化和反序列化
id = serializers.IntegerField(label='ID', read_only=True) read_only: 只在输出响应中使用, 就是给前端的时候, 而前端给我们传请求的时候, 不做验证
- 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(instance=None, data=empty, **kwarg)
说明: 序列化时, 将模型类对象传入 instance 参数 instance = 序列化对象
反序列化时, 将要被反序列化的数据传入 data 参数 data = 反序列化对象
可通过 context 参数额外添加数据 即 **kwarg : context={'request': request} 通过 Serializer 对象的 context 属性获取
"'"'
3. 序列化操作 : 其实就是查询到对象之后, 遍历构造字典的过程, 而 JsonResponse 由内置的 Renderer 渲染器来执行
3-1. 序列化只使用序列化器对象的第一个参数 instance
serializer = BookInfoSerializer(instance = book)
通过 data 属性可以获取序列化后的数据, 这个 data 跟第二个参数可不是一个
- serializer.data
- {
- 'id': 2, 'btitle': '天龙八部', 'bpub_date': '1986-07-24', 'bread': 36, 'bcomment': 40, 'image': None
- }
3-2. 如果要被序列化的是包含多条数据的查询集 QuerySet, 添加 many=True 参数
- book_qs = BookInfo.objects.all()
- serializer = BookInfoSerializer(book_qs, many=True)
- serializer.data
- "'"'
4. 关联对象嵌套序列化(由 hero->book 通过 hbook 方法)
4-1.hbook 是个外键: PrimaryKeyRelatedField
hbook = serializers.PrimaryKeyRelatedField(label='图书', read_only=True)
因为是外键, 第二个位置必须有 read_only=True 或者 查询集 queryset=BookInfo.objects.all() 要不报错
serializer.data 序列化的时候 结果是 关联对象的主键 {'hbook': 2} 即 book.id
4-2. 因为 id 不直观, 想要详细内容的字符串, 把外键字段改为 : StringRelatedField
hbook = serializers.StringRelatedField(label='图书')
结果: {'hbook': '天龙八部'}
4-3. 接口链接: HyperlinkedRelatedField
hbook = serializers.HyperlinkedRelatedField(label='图书', read_only=True, view_name='books-detail')
必须指明 view_name 参数, 以便 DRF 根据视图名称寻找路由, 进而拼接成完整 URL 这个 view_name 传什么: url 中有 1 个参数, 是命名空间, 是跟它关联
结果: {'hbook': 'http://127.0.0.1:8000/books/2/'}
4-4. 关联对象的指定字段数据 : SlugRelatedField
hbook = serializers.SlugRelatedField(label='图书', read_only=True, slug_field='bpub_date')
slug_field 指明使用关联对象的哪个字段
结果:{'hbook': datetime.date(1986, 7, 24)}
4-5. 使用关联对象的序列化器: 直接把所属 book 的所有内容序列化
hbook = BookInfoSerializer()
结果:{'hbook': OrderedDict([('id', 2), ('btitle', '天龙八部')te','1986-07-24'), ('bread', 36), ('bcomment', 40), ('image', None)])}
来源: https://www.cnblogs.com/denix-32/p/9895391.html