测试开发进阶(二十九)
欢迎关注我的公众号「测试游记」
再次优化
查看rest_framework.generics.CreateAPIView
rest_framework.generics.ListAPIView
可以看到很多重复的代码
rest_framework.generics.ListCreateAPIView
1 | class ListCreateAPIView(mixins.ListModelMixin, |
所以直接继承
1 | from projects.models import Projects |
现有问题
- 两个类视图,不能合并
- 有相同的get方法
- 两个类视图所对应的url地址不一致
再次优化
优化思路:使用动作来触发,而不是请求方法
1 | from rest_framework import viewsets |
viewsets
不再支持get/post/put/delete
等请求方法,而只支持action动作
但是ViewSet
类中没有提供get_object()
,get_serializer
等方法
继承viewsets.GenericViewSet
将两个类合成一个类
修改url
1 | from django.urls import path |
1 | from projects.models import Projects |
视图
Django中
- View
DRF中
- APIView
- GenericAPIView
- mixins扩展类
- CreateAPIView(合并拓展类)
视图集
action和请求方法的映射
- ViewSet
- GenericViewSet
- CreateViewSet
路由
1 | from rest_framework import routers |
- 创建SimpleRouter路由对象
- 注册路由
第一个参数prefix为路由前缀,一般添加为应用名称即可
第二个参数viewset为视图集「不要加as_view」
- 将自动生成的路由添加到列表中
1 | from django.urls import path, include |
action
自定义action
1 | from rest_framework.decorators import action |
1 | def action(methods=None, detail=None, url_path=None, url_name=None, **kwargs): |
可以使用action装饰器来声明自定义的动作
默认情况下,实例方法名就是动作名
methods
参数用于指定该动作支持的请求方法,默认为get
detail
用于指定该动作要处理的是否为详情资源对象「url是否需要传递pk值」
在url.py
中添加
1 | path('project/names/', views.ProjectsViewSet.as_view({ |
新增序列化器
1 | class ProjectNameSerializer(serializers.ModelSerializer): |
在view
中添加
1 |
|
同理添加Interface
需要通过projects/1/interfaces/
来拿到id=1
的interfaces
信息
添加序列化器
1 | class InterfacesNameSerializer(serializers.ModelSerializer): |
添加自定义action
1 |
|
查看路由
添加url_path
和url_name
1 |
url_path url的路径名
url_name url的别名「应用名称-url_name」
测试
1 | http :8000/projects/names/ |