gpt4 book ai didi

python - Django Rest Framework 将类级别方法添加到 api

转载 作者:行者123 更新时间:2023-11-30 23:33:01 25 4
gpt4 key购买 nike

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

最佳答案

使用 @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 装饰器。)

关于python - Django Rest Framework 将类级别方法添加到 api,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19106201/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com