我設計使用Django REST框架的API端點,並希望它以接受以下端點GET和POST方法:在下面的端點Django的REST框架 - 銷燬方法將不承擔URL的參數?
companies/<company_pk>/membership
以及DELETE方法:
companies/<company_pk>/membership/<membership_pk>
有兩種相關型號:Company
和CompanyMembership
。每個用戶可以是一個或多個公司的成員,該公司由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)
其中是你的'membership_pk'在你的銷燬方法中定義?你的意思是'kwargs ['membership_pk']' – dnit13
@ dnit13是的,所以這就是我的問題 - 當我添加一個break語句並查看'destroy'方法的kwargs時,沒有'membership_pk',即使URL我發送'POST'請求是'companies/10/membership/3' - 所以顯然有一個'membership_pk'應該以某種方式傳遞 - 我只是不確定爲什麼'destroy'方法可以' t訪問它。我懷疑我是否設置了錯誤的URL? – orange1