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

use*_*875 0 django django-rest-framework

这是我的路由器/网址:

router = routers.DefaultRouter()
router.register(r'users', views.UserViewSet)
Run Code Online (Sandbox Code Playgroud)

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

users/1
Run Code Online (Sandbox Code Playgroud)

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

eyk*_*nal 5

完成此操作的代码实际上就在文档页面上,位于本节底部。在这里引用它:

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

为此,您需要通读文档的身份验证和权限部分,特别是处理将数据与特定用户关联的部分,它建议覆盖默认perform_create视图方法以添加owner参数:

def perform_create(self, serializer):
    serializer.save(owner=self.request.user)
Run Code Online (Sandbox Code Playgroud)

回应以下评论:

perform_create方法属于GenericAPIView该类,该类具有以下功能(引自此处:)

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

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

perform_create是属于这个泛型类的函数。再次引用文档同一部分

保存和删除钩子:

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

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

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

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