测试开发进阶(二十七)
外键
PrimaryKeyRelatedField
interfaces/serializer.py
中创建序列化器
1 | from rest_framework import serializers |
测试
1 | IN[2]: from interfaces.serializer import InterfaceModelSerializer |
数据库模型中的外键字段默认会生产PrimaryKeyRelatedField序列化器字段
序列化输出的值为外键ID值
序列化输出
1 | from interfaces.models import Interfaces |
字符串关联字段StringRelatedField
重写project
1 | project = serializers.StringRelatedField(label='所属项目') |
1 | from interfaces.models import Interfaces |
StringRelatedField 此字段将被序列化为关联对象字符串表达形式(
__str__
方法返回值)
1 | project = serializers.SlugRelatedField(slug_field='tester') |
指定字段数据SlugRelatedField
SlugRelatedField 此字段被序列化为关联对象的指定字段数据
1 | project = serializers.SlugRelatedField(slug_field='name',read_only=True) |
1 | from interfaces.serializer import InterfaceModelSerializer |
关联对象的序列化器
1 | from projects.serializer import ProjectModelSerializer |
1 | from interfaces.serializer import InterfaceModelSerializer |
反向指定
父表中默认不会生产关联字段(从表),可以手动指定,字段名默认为子表模型类名「小写_set」
projects.serializer.ProjectModelSerializer
中添加
1 | interfaces_set = serializers.StringRelatedField(many=True) |
1 | from projects.serializer import ProjectModelSerializer |
优化视图-请求
1 | from rest_framework.views import APIView |
当视图继承APIView
之后,请求实例方法中的第二个参数request
为Request对象
,是对Django中的HttpRequest对象
进行的拓展
发送json
http :8000/project/ < projects.json
发送form表单
http -f :8000/project/ < projects.form
1 | name=测试游记项目&leader=icon&tester=zhongxin&programer=zhong3&publish_app=公众号&desc=无 |
Request
- 对Django中的HttpRequest进行拓展
根据请求头中的Content-Type自动进行解析
无论前端发送那种格式数据,都可以以相同的方式读取
- request.data
类似于Django中的request.POST和request.FILES
可以对POST,PUT,PATCH的请求体进行解析
支持form表单传参,支持json格式传参
- request.query_params
类似Django中的request.GET
获取查询字符串参数
- 支持Django.request中所有的对象和方法
优化视图-渲染
1 | from rest_framework.response import Response |
LearnDjango/settings.py
中添加:
1 | # 指定默认渲染类 |
修改projects.views.ProjectDetail#get
1 | def get(self, request, pk): |
渲染1
http :8000/project/1/
1 | (LearnDjango) zhongxindeMacBook-Pro:apitest zhongxin$ http :8000/project/1/ |
渲染2
浏览器中输入:http://127.0.0.1:8000/project/1/
Response
参数
- data
序列化处理后的数据
一般为serializer.data「python基本数据类型:字典,嵌套字典的列表」
- status
状态码,默认200
- template_name
模版名称,使用HTMLRenderer渲染时需要指明
- headers
用于存放响应头信息的字典
- content_type
响应头中的Content-Type
通常此参数无需设置,会自动根据前端所需类型数据来设置该参数
状态码
1 | from rest_framework import status |
修改get
1 | def get(self, request, pk): |
支持分页,排序的父类GenericAPIView
1 | from rest_framework.generics import GenericAPIView |
- 在视图类中指定过滤引擎
- 指定需要排序的字段
- 指定查询集
- 指定模型序列化器
1 | class ProjectsList(GenericAPIView): |
查看rest_framework.generics.GenericAPIView#get_queryset
1 | def get_queryset(self): |
所以:project_qs = Projects.objects.all()
和project_qs = self.get_queryset()
一致
查看rest_framework.generics.GenericAPIView#get_serializer
和rest_framework.generics.GenericAPIView#get_serializer_class
1 | def get_serializer(self, *args, **kwargs): |
1 | def get_serializer_class(self): |
所以:serializer = ProjectSerializer(instance=project_qs, many=True)
和serializer = self.get_serializer(instance=project_qs, many=True)
一致
本轮优化后的视图
1 | from django.http import Http404 |
正序
1 | zhongxindeMacBook-Pro:~ zhongxin$ http :8000/project/?ordering=id |
倒序
1 | zhongxindeMacBook-Pro:~ zhongxin$ http :8000/project/?ordering=-id |