如何构建一个从URL中提取多个参数的Django-REST路由?

2024-10-01 07:47:09 发布

您现在位置:Python中文网/ 问答频道 /正文

我已经为我的应用程序构建了一些Django Rest框架api。这些api执行诸如模型实例的返回列表和多少模型满足预先确定的标准的返回计数。在

以下是“我的视图集”的外观:

class MyObjectsViewSet(viewsets.ViewSet):

    def retrieve(self,request,pk=None):
        queryset = ## Do something here to return a list of myObjects
        serializer = MyObjectsSerializer(queryset) ## MyObjectsSerializer not shown here.
        return Response(serializer.data,status=status.HTTP_200_OK)

这是我的网址.py与此终结点类似:

^{pr2}$

上面的代码允许我获取API的一个参数,并将其用作中的pk参数MyObjectsViewSet.retrieve(). 因此,当我将浏览器指向/api/MyObjects/60/时,retrieve()会被pk==60调用。伟大的。一切都很棒。在

但现在我需要一个能做更多事情的API。我需要一个API,它接受两个数值参数(“pk”和“otherArg”)并用这两个参数调用另一个viewSet(MyObjectsNewView)。所以当我把浏览器指向/api/MyObjects/60/59/,MyObjectsNewView.retrieve将使用参数pk==60和otherArg==59调用()。在

如何在中设计路线网址.py还有我的视图集来完成这个任务?在

在其他情况下,当我设计非REST URL时,我使用regexp并使用类似这样的符号从URL字符串中指定提取参数:(?P<MyObjectID>\d+)。在

看来我也能做同样的事情。但是,它会自动接受pk参数,而不需要我在路由中的任何地方指定它,所以现在我很困惑,当第一个pk参数sorta神奇地出现在没有任何regexp模式的情况下,如何向该路由添加另一个参数。在


Tags: 模型api参数returnherestatusquerysetretrieve
2条回答

编写一个自定义的详细路由,并将签名更改为通过您打算使用的附加kwarg。然后,自定义url路径。在

from rest_framework.decorators import detail_route
from rest_framework import viewsets

class MyObjectsViewSet(viewsets.ViewSet):

    @detail_route(methods=['get'], url_path='(?P<oid>\d+)')
    def get_with_objectid(self,request,pk=None, oid=None):
        queryset = ## Do something here with oid to return a list of myObjects
        serializer = MyObjectsSerializer(queryset) ## MyObjectsSerializer not shown here.
        return Response(serializer.data,status=status.HTTP_200_OK)

现在您的视图集将使用/api/MyObjects/60/59/,其中pk=60,oid=59。如果url路径改为url_path='/thisthing/(?P(<oid>\d+)',那么视图集将注册/api/MyObjects/60/thisthing/59。在

您可以有以下模式:

url(r'^resource/(?P<clientId>[A-Za-z0-9]*)/(?P<token>[A-Za-z0-9]*)$', RestResource.as_view()),

RestResource类可以如下所示:

^{2}$

它将接受“PUT”和“DELETE”请求,路由中定义的参数将在类方法中接收。在

希望对你有帮助, 如果你需要我,我可以提供更多的细节。在

相关问题 更多 >