在django rest框架中使用request.user进行模型反序列化

时间:2014-01-13 14:27:52

标签: python django django-rest-framework serializer

假设我有这样的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

当我使用TokenAuthenticationget_queryset()时,用户只能看到自己的Todos。不幸的是,我可以发送ToDos并伪造用户字段,以便我可以垃圾邮件另一个用户的待办事项列表。我不希望这样。

我如何告诉django-rest-framework以最干/ Pythonic的方式使用request.user来表示“用户”等特定字段?毕竟这不是特殊要求,应该重复使用。

由于

1 个答案:

答案 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)