Django Rest Framework将类级别的方法添加到api [英] Django Rest Framework add class level method to api
问题描述
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屋!