Django Rest Framework为api添加了类级方法

时间:2013-10-01 00:45:03

标签: python django rest django-rest-framework

我正在使用Django Rest Framework来创建我的API。我正在使用@link返回有关特定对象的信息。

class SomeClassView(viewsets.ReadOnlyModelViewSet):
   @link
   def info(self, request, pk=None):
       obj = models.SomeClass.objects.get(pk=pk)
       return Response({"info": object.info()})

 GET: /someclass/1/info

我想要做的是扩展方法,以便我可以在“类级别”访问它,以便我的api可以接受对象列表

class SomeClassView(viewsets.ReadOnlyModelViewSet):
   @link
   def info(self, request, pk=None):
       if isinstance(s, str):
           obj = models.SomeClass.objects.get(pk=pk)
           return Response({"info": obj.info()})
       else:
           objs = models.SomeClass.objects.filter(pk__in=pk).all()
           return Response({"infos": [obj.info() for obj in objs]})

GET: /someclass/1/info
GET: /someclass/info?pk=1&pk=2&pk=3

有没有办法可以为我的api添加类级方法?或者我是否需要创建一个新类来处理一个api调用?

PS:我不介意我是否需要一个单独的方法来完成这项工作

1 个答案:

答案 0 :(得分:3)

使用@link@action装饰器的动态生成路线硬编码为/someclass/<pk>/<methodname>/。您可以通过添加自定义路由来公开/someclass/info端点,例如:

class MyRouter(DefaultRouter):
    routes = [
        Route(
            url=r'^{prefix}/((?P<pk>\d+)/)?info$',
            mapping={'get': 'info'},
            name='{basename}-info',
            initkwargs={}
        )
    ] + DefaultRouter.routes

然后您的info方法可能如下所示:

def info(self, request, pk=None):
    if pk:
        obj = SomeClass.objects.get(pk=pk)
        return Response({'info': obj.info()})
    else:
        objs = SomeClass.objects.filter(pk__in=request.GET.getlist('pk'))
        return Response({'infos': [obj.info() for obj in objs]})

(注意缺少@link装饰者。)