这是我的路由器/网址:
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来实现这一点。
答案 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
方法没有其他目的。