使用DRF视图集时自定义action方法

Posted chichung

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用DRF视图集时自定义action方法相关的知识,希望对你有一定的参考价值。

在我们用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装饰器的使用!

以上是关于使用DRF视图集时自定义action方法的主要内容,如果未能解决你的问题,请参考以下文章

drf-路由

drf-路由组件

05 drf路由组件

DRF中五大扩展类及视图集的介绍

DRF ---- 视图类 数据工具类 工具视图集 视图集

DRF框架之视图集(ModelViewSet)简介