DjangoRestFramework - 仅当request.user正在查看自己的User对象时才允许某些请求?

时间:2015-10-19 02:15:34

标签: django django-rest-framework

这是我的路由器/网址:

router = routers.DefaultRouter()
router.register(r'users', views.UserViewSet)

如果request.user是他自己的User对象,我只希望用户能够进行PUT,POST,PATCH和DELETE。我的意思是,如果用户访问此URL

users/1

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

1 个答案:

答案 0 :(得分:4)

实现此目的的代码实际上位于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

  

保存和删除挂钩:

     

mixin类提供了以下方法,并提供了对象保存或删除行为的轻松覆盖。

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

因此,除了提供一种简单的方法来修改创建新对象时发生的事情,perform_create方法没有其他目的。