嵌套路由上的Django REST权限
我使用的是Django REST框架。我的一条路线看起来像:嵌套路由上的Django REST权限,django,django-rest-framework,nested-routes,django-guardian,Django,Django Rest Framework,Nested Routes,Django Guardian,我使用的是Django REST框架。我的一条路线看起来像:companys/$company/locations/$location,其中$company和$location是slug变量 我想允许用户发布到此URL:公司/$company/locations/以添加新的位置。我想确保发布帖子的用户对他要发布到的公司拥有更正权限。我目前使用django-guardian作为我的对象级权限。POST消息只包含新位置的名称,不包含可以从URL推断的公司名称。 在这种情况下,我很难正确执行权限。我一
companys/$company/locations/$location
,其中$company
和$location
是slug变量
我想允许用户发布到此URL:公司/$company/locations/
以添加新的位置。我想确保发布帖子的用户对他要发布到的公司拥有更正权限。我目前使用django-guardian
作为我的对象级权限。POST消息只包含新位置的名称,不包含可以从URL推断的公司名称。
在这种情况下,我很难正确执行权限。我一直在从视图集的pre_save
方法设置新位置
对象的company
字段,但这太晚了,无法应用权限检查
实施这一点的最佳方式是什么
如果用户确实在帖子中包含公司,我可以通过将以下内容添加到视图集中来验证公司:
def get_queryset(self):
parent = super(LocationViewSet, self).get_queryset()
return parent.filter(company__slug=self.kwargs['company_slug'])
实际上,我发现了一种相当丑陋的方法,检索父对象并根据请求的用户检查它的归属
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)
你找到解决办法了吗?@alex你是如何在pre_save方法中得到公司slug的?我也在寻找你实际问题的答案,你能发布URL、视图和序列化程序吗?