我正在使用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:我不介意我是否需要一个单独的方法来完成这项工作
答案 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
装饰者。)