我正在使用带有nested router extension的Django REST框架。我的其中一条路线如下:companies/$company/locations/$location
其中$company
和$location
是子弹变量。
我想允许用户POST到此网址:companies/$company/locations/
以添加新位置。我想确保执行POST的用户具有他正在POST的公司的更正权限。我目前使用django-guardian
作为对象级权限。 POST消息仅包含新位置的名称,它不包含公司名称,因为可以从URL中推断出该名称。
在这种情况下,我很难正确地执行权限。我一直在从视图集的company
方法设置新Location
对象的pre_save
字段,但这对于应用权限检查来说太迟了。
执行此操作的最佳方法是什么?
如果用户确实在POST中包含公司,我可以通过在视图集中添加以下内容来验证公司:
def get_queryset(self):
parent = super(LocationViewSet, self).get_queryset()
return parent.filter(company__slug=self.kwargs['company_slug'])
答案 0 :(得分:0)
好吧,我实际上发现了一种相当丑陋的方法,检索父对象并检查它是否属于请求的用户。
def create(self, request, *args, **kwargs):
request.data['catspad'] = kwargs['catspad_pk']
if not Catspad.objects.get(id=kwargs['catspad_pk']).owner == request.user:
return Response(status=HTTP_401_UNAUTHORIZED)
serializer = self.get_serializer(data=request.data)
serializer.is_valid(raise_exception=True)
self.perform_create(serializer)
headers = self.get_success_headers(serializer.data)
return Response(serializer.data, status=HTTP_201_CREATED, headers=headers)