9

我正在使用带有嵌套路由器扩展的 Django REST 框架。我的一条路线看起来像:companies/$company/locations/$locationwhere$company$locationare slug 变量。

我想允许用户发布到这个 URL:companies/$company/locations/添加新的位置。我想确保执行 POST 的用户对他正在发布的公司具有更正权限。我目前django-guardian用于我的对象级权限。POST 消息仅包含新位置的名称,它不包含可以从 URL 推断出的公司名称。在这种情况下,我很难正确执行权限。我一直在从视图集的方法中设置companyLocation对象的字段,pre_save但这对于应用权限检查来说为时已晚。

执行此操作的最佳方法是什么?

如果用户确实在 POST 中包含公司,我可以通过将以下内容添加到视图集中来验证公司:

def get_queryset(self):
    parent = super(LocationViewSet, self).get_queryset()    
    return parent.filter(company__slug=self.kwargs['company_slug'])
4

1 回答 1

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)
于 2016-06-10T15:20:27.547 回答