【问题标题】:Use request.user for model deserialization in django rest framework在 django rest 框架中使用 request.user 进行模型反序列化
【发布时间】:2014-01-13 14:27:52
【问题描述】:

假设我有一个这样的 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 并伪造用户字段,这样我就可以向另一个用户的 ToDo 列表发送垃圾邮件。我不想要那个。

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

谢谢

【问题讨论】:

    标签: python django django-rest-framework serialization


    【解决方案1】:

    在 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)
    

    【讨论】:

    • 谢谢,应该可以,但我仍在寻找另一种解决方案,因为我想使用request.user 作为user 的默认值,因此客户端不必发送用户 ID .
    • 正是我想要的!注意:我必须从序列化程序的字段列表中删除“用户”,否则 pre_save() 将不会被调用
    • 如果 ToDo 条目无法更改所有者,您可以将 editable=False 添加到 user = models.ForeignKey(UserModel)
    • 这对我不起作用。对于这个人groups.google.com/forum/#!topic/django-rest-framework/…
    • 你试过user = models.ForeignKey(UserModel, blank=True)吗?
    猜你喜欢
    • 2017-04-14
    • 2015-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-07
    • 2012-11-16
    • 1970-01-01
    相关资源
    最近更新 更多