Django REST框架限制发布和可浏览的Api字段

时间:2014-09-17 20:13:03

标签: django-rest-framework

我将Django Rest framework与JavaScript应用结合使用。使用通用ModelViewSet

来发布新数据项时遇到一些困难

最重要的是,我想限制一张海报可以提交的内容 (只允许他们发布具有该用户的user_id的项目(会话的经过身份验证的用户)。

我不知道应该在何时/何地检查此事?这是验证问题吗? 我如何理解权限类是他们限制方法(Post / Get)或检查用户组。

item model中的我的用户字段也是user model的外键 所以可浏览的api在Html格式中建议下拉有关其他用户的信息。 (他们的电子邮件地址和其他一些领域)。

我的数据项看起来像这样

[{
    "id": 792,
    "name": "test",
    "category": 1,
    "value": 5,       
    "user": "33"
}]

这是我的Serializer和Viewset:

class ItemSerializer(serializers.ModelSerializer):

    class Meta:
        model = Item
        fields = ('id',
                  'name',
                  'category',
                  'value',
                  'user',
        )

class ItemViewSet(viewsets.ModelViewSet):
    serializer_class = ItemSerializer

    def get_queryset(self):
        return Item.objects.filter(user=self.request.user)

1 个答案:

答案 0 :(得分:0)

处理用户字段

首先将用户字段设置为只读:

# serializers.py     

class ItemSerializer(serializers.ModelSerializer):
    user = serializers.ReadOnlyField()
    class Meta:
        model = Item
        fields = ('id',
                  'name',
                  'category',
                  'value',
                  'user',
        )

然后在创建时自动设置用户ID:

# views.py

class ItemViewSet(viewsets.ModelViewSet):
    serializer_class = ItemSerializer

    def get_queryset(self):
        return Item.objects.filter(user=self.request.user)

    def perform_create(self, serializer):
        serializer.save(user=self.request.user.customer)

处理权限

只需使用standard permissions mechanism定义自定义帐号:

# permissions.py

from rest_framework import permissions

class IsOwner(permissions.BasePermission):
    def has_object_permission(self, request, view, obj):
        return (request.user.is_authenticated() and
                (obj.user == request.user.customer))

...并在您的视图集中使用它:

# views.py

from permissions import IsOwner

class ItemViewSet(viewsets.ModelViewSet):
    permission_classes = [IsOwner]
    ...