2014-02-26 34 views
2

我正在構建一個公開REST API的Django應用程序,用戶可以通過它來查詢我的應用程序的模型。我遵循here的說明。如何獲取傳遞給Django REST API的ID?

我的路線是這樣的對myApp的url.py:

from rest_framework import routers 
router = routers.DefaultRouter() router.register(r'myObjects/(?P<id>\d+)/?$', 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.get(pk=self.kwargs['id']) 
    serializer_class = MyObjectSerializer 

當我hit/api/myObjects/60 /我從Viewset的第一行得到以下錯誤:

name 'self' is not defined 

爲什麼??如何在我的視圖中獲取60的ID並使用該ID獲取MyObject?

回答

4

我會使用ViewSet反對ModelViewSet。下面的代碼應該做你所需要的,除非有很強的理由使用ModelViewSet。如果你去的URL說http://yourdomain/yourmodel/10的PK變量將有10

class YourModelViewSet(viewsets.ViewSet): 

    def retrieve(self,request,pk=None): 
     u = request.user 
     queryset = YourModel.objects.filter(user=u,pk=pk) 
     if not queryset: 
      return Response(status=status.HTTP_400_BAD_REQUEST) 
     else: 
      serializer = YourModelSerializer(queryset) 
      return Response(serializer.data,status=status.HTTP_200_OK) 

謝謝值 - 希望它可以幫助

+0

謝謝!這看起來像我所需要的。你能告訴我我需要導入什麼模塊才能獲得Response()? –

+1

以下是導入 - 來自rest_framework.response導入響應 –

0

您的記錄器行引用了自我,但在該上下文中沒有自我(您處於類級別,不在方法內)。嘗試刪除記錄器行。

+0

你能告訴我我應該怎麼做,如果我想查詢集被設置與pk = 60的myObject的值? queryset = Profile.objects.get(pk = self.kwargs ['id'])給了我完全相同的錯誤。 –

+0

相應編輯問題以更清楚地顯示問題。 –

0

由於您使用的是viewsets.ModelViewSet Django Rest Framework爲您處理特定對象的所有過濾。將您的queryset物業更改爲MyObjects.objects.all()

覆蓋queryset如其他人建議將打破/myObjects/路由,因爲id不存在。

+0

我不在乎/ myObjects /路線。我只需要/ myObjects/60 /路線工作。但是,當這種情況發生時,我希望這個API返回MyObjects.objects.get(pk = 60).myFunction()。我如何做到這一點? –

相關問題