前言
上一节的action
都是常用方法默认对应的,但是我们在实际应用中,往往需要自定义action
DRF
的@action
装饰器
-
@action()
:自定义action
- 参数1:
methods
:声明该action
对应的请求方式,默认GET
- 参数2:
detail
:声明该action
是否和单一资源对应(传递pk
),以及是否是xxx/<pk>/action方法名/
格式的请求路径-
True
:表示请求路径是xxx/<pk>/action方法名/
格式 -
False
:表示请求路径是xxx/action方法名/
格式
-
- 参数3(少用):
url_path
:声明该action
的url_path
,默认使用该action
所装饰的方法的名称 - 参数4(少用):
url_name
:声明该action
的url_name
,默认使用该action
所装饰的方法的名称
- 参数1:
场景1、返回所有projcet
的name
1、新增序列化器,projecst/serializer.py
:
class ProjectNameSerializer(serializers.ModelSerializer):
class Meta:
model = Projects
fields = ( 'name')
2、自定义action
,views.py
:
@action(methods=['get'], detail=False)
def names(self, request, *args, **kwargs):
queryset = self.get_queryset()
serializer = ProjectNameSerializer(instance=queryset, many=True)
return Response(serializer.data)
3、添加对应路由:projecst/urls.py
:
path('project/names/', views.ProjectsViewSet.as_view({
'get', 'names' # 对应action所装饰的方法的名称
}))
场景2、查询指定projcet
所有的interface
1、新增序列化器,projecst/serializer.py
:
class InterfacesNameSerializer(serializers.ModelSerializer):
class Meta:
model = Interfaces
fields = ('id', 'name', 'tester')
class InterfacesByProjectIdSerializer(serializers.ModelSerializer):
# 反向指定,查询projecet时,同时生成从表interface的字段(InterfacesNameSerializer中指定了所生成的字段)
interfaces_set = InterfacesNameSerializer(read_only=True, many=True)
class Meta:
model = Projects
fields = ('id', 'interfaces_sets')
2、自定义action
,views.py
:
@action(detail=True)
def interfaces(self, reques, *args, **kwargs):
instance = self.get_queryset()
serializer = InterfacesByProjectIdSerializer(instance=instance)
return Response(serializer.data)
3、添加对应路由:projecst/urls.py
:
path('project/<int:pk>/interfaces', views.ProjectsViewSet.as_view({
'get', 'interfaces'
}))