在我们用DRF视图集完成了查找全部部门,创建一个新的部门,查找一个部门,修改一个部门,删除一个部门的功能后,views.py的代码是这样子的:
class DepartmentViewSet(ModelViewSet): queryset = Department.objects.all() serializer_class = DepartmentSerializer
现在需要新增一个功能,查询最新成立的部门。
这时,我们就需要自定义action方法了。
新增功能后的代码如下:
class DepartmentViewSet(ModelViewSet): queryset = Department.objects.all() serializer_class = DepartmentSerializer def lastest(self,request): """查看最新成立的部门""" dep = Department.objects.latest("create_date") serializer = self.get_serializer(instance=dep) return Response(serializer.data)
但是,还有一个问题,在视图集的路由设置里,本来用了DRF提供的router快捷地完成了视图的设置。但是增加的这个自定义方法,因为他的特殊性,生成的url地址并没有它。那么应该怎么办呢?
这时就需要使用rest_framework.decorators.action
装饰器给自定义的方法进行装饰,装饰后它就能自动生成了。
增加多一行代码,最后变成:
class DepartmentViewSet(ModelViewSet): queryset = Department.objects.all() serializer_class = DepartmentSerializer @action(methods=['get'],detail=False) # detail=False表示不需要匹配主键的正则,函数不需要传入主键就设为False def lastest(self,request): """查看最新成立的部门""" dep = Department.objects.latest("create_date") serializer = self.get_serializer(instance=dep) return Response(serializer.data)
注意action装饰器的使用!