假设我有这样的ToDo模型:
class ToDo(models.Model):
user = models.ForeignKey(UserModel)
text = models.CharField(max_length=255, blank=True)
我正在为我的API使用django rest框架。那么我将为序列化器提供这个:
class ToDoSerializer(serializers.ModelSerializer):
class Meta:
model = ToDo
fields = ('text', 'id', 'user')
这适用于ViewSet
:
class ToDoResponder(viewsets.ModelViewSet):
authentication_classes = (TokenAuthentication,)
permission_classes = (IsAuthenticated,)
model = ToDo
def get_queryset(self):
return ToDo.objects.filter(user=self.request.user)
serializer_class = ToDoSerializer
当我使用TokenAuthentication
和get_queryset()
时,用户只能看到自己的Todos。不幸的是,我可以发送ToDos并伪造用户字段,以便我可以垃圾邮件另一个用户的待办事项列表。我不希望这样。
我如何告诉django-rest-framework
以最干/ Pythonic的方式使用request.user
来表示“用户”等特定字段?毕竟这不是特殊要求,应该重复使用。
由于
答案 0 :(得分:2)
在drf doc http://www.django-rest-framework.org/tutorial/4-authentication-and-permissions中,您可以找到创建新权限的解决方案:
from rest_framework import permissions
class IsOwner(permissions.BasePermission):
def has_object_permission(self, request, view, obj):
return obj.user == request.user
此时您可以在ToDoResponder
permission_classes = (IsAuthenticated, IsOwner)
在ToDoResponder
:
def pre_save(self, obj):
obj.user = self.request.user
super(ToDoResponder, self).pre_save(obj)