2014-03-03 24 views
8

我已經爲我的應用程序構建了一些Django-Rest-Framework API。這些API執行諸如模型實例的返回列表之類的事情,並返回有多少模型符合預定標準的計數。如何構建一個從URL中提取多個參數的Django REST路由?

這裏是我的視圖集的樣子:

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) 

這裏是我的urls.py看起來像這個端點:

router = routers.DefaultRouter() 
router.register(r'myObjects', views.myObjectsViewSet, base_name="myObjects") 

urlpatterns = patterns('', 
    ... 
    url(r'^api/', include(router.urls)), 
    ... 
) 

上面的代碼讓我接單參數添加到API中,並將其用作MyObjectsViewSet.retrieve()中的pk參數。所以當我將瀏覽器指向/ api/MyObjects/60 /時,使用pk == 60調用retrieve()。很好。一切都很棒。

但現在我需要一個API來做更多的事情。我需要一個接受兩個數字參數(「pk」和「otherArg」)並用這兩個參數調用另一個viewSet(MyObjectsNewView)的API。因此,當我將瀏覽器指向/ api/MyObjects/60/59 /時,MyObjectsNewView.retrieve()將以參數pk == 60和其他Arg == 59來調用。

如何在url中設計我的路線.py和我的Viewset使這個工作?

在其他情況下,當我設計非REST URL時,我使用了正則表達式並使用這樣的表示法來指定來自URL字符串的提取參數:(?P<MyObjectID>\d+)

看來我應該可以在這裏做同樣的事情。然而,它會自動接受pk參數,而無需在路徑中的任何位置指定它,所以現在我很困惑如何在第一個pk參數sorta在沒有任何正則表達式模式的情況下出現時,爲此路線添加另一個參數。

回答

3

你可以有以下模式:

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

而且RestResource類可以是這個樣子:

class RestResource(View): 
    def put(self, request, clientId, token): 
    # Your code here 
    return HttpResponse(json.dumps(JSON_DATA_VARIABLE), content_type = "application/json", status = 200) 

    def delete(self, request, clientId, token): 
    # Your code here 
    return HttpResponse(json.dumps(JSON_DATA_VARIABLE), content_type = "application/json", status = 200) 

它將接受「PUT」和「刪除」的要求和參數定義在路線中將以類方法接收。

希望它可以幫助你, 如果你需要我,我可以提供進一步的細節。

4

寫一個自定義的詳細路線,並更改簽名以傳遞您打算使用的額外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_path改爲url_path='/thisthing/(?P(<oid>\d+)',則視圖集將註冊/api/MyObjects/60/thisthing/59

相關問題