2014-02-26 25 views
11

我正在構建一個公開REST API的Django應用程序,用戶可以通過它來查詢我的應用程序的模型。我按照指示here如何獲取Django視圖集中的API參數?

我的路線是這樣的mySites url.py:

router.register(r'myObjects', views.MyObjectsViewSet) 
.... 
url(r'^api/', include(router.urls)), 

我的串行看起來是這樣的:

class MyObjectSerializer(serializers.HyperlinkedModelSerializer): 
    class Meta: 
     model = MyObject 
    fields = ('id', 'name',) 

我的視圖集中看起來是這樣的:

class MyObjectsViewSet(viewsets.ModelViewSet): 
    queryset = MyObjects.objects.all() 
    serializer_class = MyObjectSerializer 

當我打開API/api/myObjects /它給我一個全部列表e myObject模型。 當我點擊API/api/myObjects/60 /時,它只給出了id爲60的myObject。 太好了!

但是,我想要更改MyObjectsViewSet()的邏輯,以便在我點擊/ api/myObjects/60 /時可以操縱/更改它返回的內容。因此,我不想做MyObjects.objects.all()我想根據60的myObject ID做更復雜的事情。但是我怎麼做?在這個視圖中,我怎樣才能抓住這個數字60?它沒有被作爲參數傳入。但我真的需要它!

回答

0

我想你可以更新您的多種操作視圖如

class RetrieveUpdateAPIView(mixins.RetrieveModelMixin, 
         mixins.UpdateModelMixin, 
         generics.SingleObjectAPIView): 
""" 
Concrete view for retrieving or updating a model instance. 
FIXME: the newest version of rest_framework has this class 
""" 

def get(self, request, *args, **kwargs): 
    return self.retrieve(request, *args, **kwargs) 

def put(self, request, *args, **kwargs): 
    return self.update(request, *args, **kwargs) 

def create(self, request, *args, **kwargs): 
    return self.create(request, *args, **kwargs) 

敬請收看tutorial它會幫助你瞭解REST框架。

9

在你的路由器,註冊一個多個URL用:

router.register(r'myObjects/(?P<id>\d+)', views.MyObjectsViewSet) 

,並在您的視圖集中,你可以抓住的ID有:

self.kwargs['id'] 

編號:http://www.django-rest-framework.org/api-guide/filtering#filtering-against-the-url

+0

這看起來非常有前途!正是我需要的。 但是,當我在視圖中打印self.kwargs ['id']時,出現以下錯誤:名稱'self'未定義 –

+0

您將不得不在視圖集方法中執行復雜的操作。文檔以get_queryset示例 http://www.django-rest-framework.org/api-guide/filtering#filtering-against-the-url – cyriacthomas

+2

爲什麼選擇這麼高?這是一個視圖的性質創建超過1個新的網址... – Cruncher

相關問題