Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/wordpress/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django Rest框架向api添加类级方法_Python_Django_Rest_Django Rest Framework - Fatal编程技术网

Python Django Rest框架向api添加类级方法

Python Django Rest框架向api添加类级方法,python,django,rest,django-rest-framework,Python,Django,Rest,Django Rest Framework,我正在使用Django Rest框架创建我的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:

我正在使用Django Rest框架创建我的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:我不介意是否需要一个单独的方法来完成这项工作

使用
@链接
@action
装饰器动态生成的路由是硬编码的,看起来像
/someclass//
。您可以通过添加自定义路由来公开
/someclass/info
端点,例如:

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

(注意没有
@link
装饰器。)

我很害怕。我希望最终的解决方案是课堂的一部分。
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]})