2015-10-19 33 views
0

这是我的路由器/网址:DjangoRestFramework - 只有在request.user正在查看自己的用户对象时才可以允许某些请求?

我只希望用户能够PUT,POST,PATCH和DELETE如果request.user是他自己的用户对象。我的意思是,如果一个用户进入这个网址

users/1 

然后DRF查找如果用户不request.user,那么我不希望允许request.user到其PK为1的用户能够POST,PUT,PATCH或DELETE。如果用户是request.user,那么我想允许这些请求。有什么办法可以做到这一点?我使用的是Viewset,我希望我可以继续使用Viewset来实现这一点。

回答

2

完成此操作的代码实际上位于文档页面this section的底部。在这里引用一下:

@detail_route(methods=['post'], permission_classes=[IsAdminOrIsSelf]) 
def set_password(self, request, pk=None): 
    ... 

对于工作,你会希望通过文档的Authentication and permission部分,尤其是涉及associating data with a particular user的部分,这表明覆盖默认perform_create视图的方法来添加一个owner阅读参数:

def perform_create(self, serializer): 
    serializer.save(owner=self.request.user) 

响应于下面的评论:

perform_create方法属于GenericAPIView类,其具有以下功能(从here引用:)

此类扩展REST框架的APIView类,添加了对标准列表和详细视图通常所需的行为。

提供的每个具体通用视图都是通过将GenericAPIView与一个或多个mixin类相结合而构建的。

perform_create是属于这个泛型类的函数。再次引述same section of the docs

保存和删除钩:

由混入类提供下面的方法,以及提供该对象的容易压倒一切的保存或删除行为。

  • perform_create(self, serializer) - 保存新对象实例时调用CreateModelMixin
  • ...

所以,perform_create方法没有除了提供一个简单的方法来修改创建新对象时,会发生什么目的。

+0

谢谢。快速问题,“IsAdminOrIsSelf”的文档在哪里?我试着看这里:http://www.django-rest-framework.org/api-guide/permissions/,它不在那里。任何想法,我可以找到它?我最初通过“APIGuide”读取“权限”来查找该权限,但没有找到它,这是我决定发布该问题的时间。 – user2719875

+1

@ user2719875 - 你知道,我试图找到一个完全相同的问题的答案,同时查看这个并找不到任何东西。我能做的最好的就是指向[源代码](https://github.com/sebastibe/django-rest-skeleton/blob/master/api/users/permissions.py);这很简单,也许这将是有用的。 – eykanal

+0

我很难理解perform_create做什么。 perform_create是视图类的一种方法。它在“serializer.save()”(在视图中)执行后立即调用。然后它会执行“serializer.save(owner = self.request.user)”。所有者现在传递给序列化器的“create()”方法,但为什么甚至需要?在文档中的“与特定用户关联数据”部分中,create()方法甚至未被编辑为使用owner参数。这不会引发一个错误,说“期望2个位置参数(request和validated_data),但给出了3个?” – user2719875

相关问题