在django rest中仅使特定用户(即创建该模型的用户)可以访问该视图

时间:2018-06-10 15:41:30

标签: django django-rest-framework

我有一个模型,其用户作为其ForeignKey属性,即自动填充即。登录用户填写在那里。我做了令牌认证。仅认证//我的意思是授权用户可以访问该视图。但我打算这样做 只有创建该模型对象的用户才能更新该对象的内容。 例如:

class Something(models.Model):
    sth_name = models.CharField(max_length=18)
    sth_qty = models.IntegerField()
    user = models.ForeignKey(User)

在我的观点上: 我重写perform_create()以关联到上面的模型automaticall。

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

我到底需要做什么?我必须写一些权限方法,但我真的被卡住了。

2 个答案:

答案 0 :(得分:1)

是的,您需要创建对象级权限。 DRF教程在这里很好地介绍了这一点:http://www.django-rest-framework.org/tutorial/4-authentication-and-permissions/#object-level-permissions

具体来说,在您的应用中创建一个文件permissions.py,并在其中添加此权限:

class IsOwnerOrReadOnly(permissions.BasePermission):
    """
    Custom permission to only allow owners of an object to edit it.
    """

    def has_object_permission(self, request, view, obj):
        if request.method in permissions.SAFE_METHODS:
            return True
        return obj.user == request.user

然后,在具有Something模型更新资源的视图类(可能是SomethingDetail)中,添加permission_classes字段:

class SomethingDetail(generics.RetrieveUpdateDestroyAPIView):
    queryset = Something.objects.all()
    serializer_class = SomethingSerializer
    permission_classes = (permissions.IsAuthenticatedOrReadOnly,
                          IsOwnerOrReadOnly,)

答案 1 :(得分:0)

只需在检索对象时添加用户

obj = get_object_or_404(Something, pk=pk, user=request.user)

请注意,这将抛出404.如果您想要403错误,请使用自定义条件检查用户并引发PermissionDenied。如果要对多个视图执行此操作,请将条件逻辑放在装饰器中。