2016-06-10 51 views
0

我設計使用Django REST框架的API端點,並希望它以接受以下端點GET和POST方法:在下面的端點Django的REST框架 - 銷燬方法將不承擔URL的參數?

companies/<company_pk>/membership 

以及DELETE方法:

companies/<company_pk>/membership/<membership_pk> 

有兩種相關型號:CompanyCompanyMembership。每個用戶可以是一個或多個公司的成員,該公司由CompanyMembership的實例表示,其由FK鏈接到Company

我已經創建了適當的GET和POST請求,但是在DELETE請求時遇到問題 - 看來我的視圖中的destroy方法缺少membership_pk參數,無論我是否在我的URL中定義它。如何讓我的視圖接受刪除CompanyMembership實例的DELETE請求,這些實例由URL中給出的membership_pk標識?

urls.py 

... 
    url(r'^companies/(?P<company_pk>[0-9]+)/membership', include(company_urls.company_membership_router.urls, 
     namespace='company_memberships')), 
... 

views.py 


class CompanyMembershipViewSet(viewsets.ModelViewSet): 
    """ 
    A ViewSet for creating, retrieving, and deleting CompanyMemberships. 
    """ 
    queryset = CompanyMembership.objects.all() 
    serializer_class = CompanyMembershipSerializer 
    lookup_url_kwarg = 'company_pk' 

    def get_queryset(self): 
     uid = self.kwargs.get(self.lookup_url_kwarg) 
     memberships = CompanyMembership.objects.filter(company_id=uid) 
     return memberships 

    def create(self, request, company_pk): 
     """ 
     Custom create method since company_pk does not have to be sent 
     explicitly within request.data 

     Returns: instance of rest_framework Response. 
     """ 
     EXISTING_USER_ERROR = {'non_field_errors': 
      ['The fields user, company must make a unique set.'] 
     } 
     data = { 
      'user': request.data['user'], 
      'company': company_pk 
     } 
     serializer = CompanyMembershipSerializer(data=data) 
     if serializer.is_valid(): 
      serializer.save() 
      return Response(serializer.data, status=status.HTTP_201_CREATED) 
     if serializer.errors == EXISTING_USER_ERROR: 
      return Response(serializer.errors, status=settings.ADDITIONAL_HTTP_STATUS_CODES['422_UNPROCESSABLE_ENTITY']) 
     return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) 

    def destroy(self, request, **kwargs): 
     company_membership = self.get_object(pk=membership_pk) 
     company_membership.delete() 
     return Response(status=status.HTTP_204_NO_CONTENT) 


routers.py 
    from rest_framework import routers 

    from .views import CompanyViewSet, CompanyMembershipViewSet 


    company_router = routers.DefaultRouter() 
    company_membership_router = routers.DefaultRouter() 

    company_router.register(r'^', CompanyViewSet) 
    company_membership_router.register(r'^', CompanyMembershipViewSet) 
+1

其中是你的'membership_pk'在你的銷燬方法中定義?你的意思是'kwargs ['membership_pk']' – dnit13

+0

@ dnit13是的,所以這就是我的問題 - 當我添加一個break語句並查看'destroy'方法的kwargs時,沒有'membership_pk',即使URL我發送'POST'請求是'companies/10/membership/3' - 所以顯然有一個'membership_pk'應該以某種方式傳遞 - 我只是不確定爲什麼'destroy'方法可以' t訪問它。我懷疑我是否設置了錯誤的URL? – orange1

回答

1

公司會員路由器生成以下網址:

companies/<company_pk>/membership/ # for handling list requests 
companies/<company_pk>/membership/<pk>/ # for handling detail requests 

您可以使用pk URL kwarg訪問membership_pk

另外,您在視圖集中錯誤地定義了lookup_url_kwarg字段。此kwarg由DRF用於使用get_object()方法檢索對象。你沒有得到對象,因爲它試圖用pk作爲company_pk url的kwarg值而不是pk的值執行查找。

+1

謝謝。通過刪除'lookup_url_kwarg'並通過使用'Membership.objects.get(pk = self.kwargs.get('pk'))來查找對象來管理查找它' – orange1