Django Rest Framework将类级别的方法添加到api [英] Django Rest Framework add class level method to api

查看:117
本文介绍了Django Rest Framework将类级别的方法添加到api的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用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()obj在objs]})

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

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



PS:我不介意如果我需要一个单独的方法来使这项工作

解决方案

使用 @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

然后你的信息方法可能如下所示:

  def info(self,request,pk = None):
如果pk:
obj = SomeClass.objects.get(pk = pk)
返回响应({'info':obj.info()})
else:
objs = SomeClass.objects .filter(pk__in = request.GET.getlist('pk'))
返回响应({'infos':obj.info()obj在objs]})

(请注意,缺少 @link 装饰器。)


I am using Django Rest Framework to create my API. I am using @link to return information about a particular object.

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

What I would like to do is extend the method so I can access it at the "class level" so that my api could accept a list of objects

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

Is there a way I can add a class level method to my api? Or will I need to create a new class to handle the one api call?

PS: I don't mind if I need to have a separate method to make this work

解决方案

The dynamically generated routes using the @link or @action decorators are hard-coded to look like /someclass/<pk>/<methodname>/. You can expose a /someclass/info endpoint by adding a custom route, e.g.:

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

Then your info method might look like this:

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]})

(Note the absence of the @link decorator.)

这篇关于Django Rest Framework将类级别的方法添加到api的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆