【发布时间】:2016-10-11 11:01:46
【问题描述】:
我正在使用 Django REST Framework 设计一个 API 端点,并希望它在以下端点接受 GET 和 POST 方法:
companies/<company_pk>/membership
以及以下端点的 DELETE 方法:
companies/<company_pk>/membership/<membership_pk>
有两个相关模型:Company 和 CompanyMembership。每个用户可以是一个或多个公司的成员,由CompanyMembership 的一个实例表示,该实例通过FK 链接到Company。
我已经创建了适当的 GET 和 POST 请求,但在处理 DELETE 请求时遇到了问题——我的视图中的 destroy 方法似乎缺少 membership_pk 参数,无论我是否在其中定义它我的网址。如何让我的视图接受删除 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 是的,这正是我的问题——当我添加一个 break 语句并在 kwargs 中查找
destroy方法时,没有membership_pk,即使我发送的 URL 是POST请求是companies/10/membership/3- 所以显然有一个membership_pk应该以某种方式传递 - 我只是不确定为什么destroy方法无法访问它。我怀疑我的 URL 设置有误?
标签: python django rest python-3.x django-rest-framework