我有一个模型,其用户作为其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)
我到底需要做什么?我必须写一些权限方法,但我真的被卡住了。
答案 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
。如果要对多个视图执行此操作,请将条件逻辑放在装饰器中。