嵌套路由的Django REST权限

时间:2014-06-24 03:27:13

标签: django django-rest-framework nested-routes django-guardian

我正在使用带有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'])

1 个答案:

答案 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)