【发布时间】:2015-09-20 13:30:58
【问题描述】:
使用 DRF 设置用户可以共享内容的平台,我无法检查作者是否与登录的用户匹配。
内容模型示例:
class Post(models.Model):
date = models.DateTimeField()
author = models.ForeignKey(User)
content = models.CharField(max_length=512)
内容序列化器:
class PostSerializer(serializers.ModelSerializer):
class Meta:
model = Post
内容视图:
@authentication_classes((SessionAuthentication, BasicAuthentication,))
@permission_classes((IsAuthenticated,))
class PostViewSet(viewsets.ModelViewSet):
queryset = Post.objects.all()
serializer_class = PostSerializer
http_method_names = ['get', 'post', 'head', 'options',]
我希望帖子请求在保存帖子之前执行 post.author == request.user 测试。
一方面我的直觉告诉我应该用那种代码覆盖视图的 create 方法(未经测试,但在这里我只是想说明我想要做什么):
class PostViewSet(viewsets.ModelViewSet):
[...]
def create(self, request):
post = self.get_object()
serializer = PostSerializer(data=request.data)
if serializer.is_valid():
if serializer.validated_data.author == request.user:
serializer.save()
return Response({'message': 'Post saved !'})
else:
return Response({'message': 'You can't post for someone else'})
else:
return Response({'message': 'Not valid...'})
另一方面,当我在我最喜欢的搜索引擎上搜索类似问题时,我只能找到涉及覆盖序列化程序类中的创建/更新方法的答案。
我对rest apis和DRF不太熟悉,但我很困惑,因为我说的是一种自定义权限(权限是在视图中处理的,对吧?)。
寻找好的做法提示:)
【问题讨论】:
-
请将您的答案中的“post”更改为
POST,您的意思是HTTP方法。
标签: django post permissions django-rest-framework