2014-02-26 1 views
2

사용자가 내 애플리케이션의 모델을 쿼리 할 수있는 REST API를 제공하는 Django 애플리케이션을 구축 중입니다. 나는 지침 here을 따르고있다. 내 경로가을 myApp의 url.py에서 다음과 같습니다Django REST API에 전달 된 ID를 얻으려면 어떻게해야합니까?

는 :

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 

때 I을 hit/api/myObjects/60/Viewset의 첫 번째 줄에서 다음 오류가 발생합니다.

name 'self' is not defined 

왜 ?? 내 뷰 집합에서 ID 60을 가져와 해당 ID로 MyObject를 가져 오는 방법은 무엇입니까?

답변

4

ModelSetSet과 반대되는 것으로 ViewSet을 사용합니다. 아래 코드는 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()으로 변경하십시오.

id이 없기 때문에 queryset을 다른 사람보다 우선적으로 무시하면 /myObjects/ 경로가 손상됩니다.

+0

/myObjects/route는 신경 쓰지 않습니다. 필자는/myObjects/60/route 만 작동하면됩니다. 하지만 그렇게되면이 API가 MyObjects.objects.get (pk = 60) .myFunction()을 반환하도록합니다. 어떻게해야합니까? –

관련 문제