Django Rest Framework - 创建权限

时间:2016-07-05 13:20:33

标签: django django-rest-framework

我在django rest框架中有一个CRUD并控制我正在使用权限类的权限。这是我为CRUD创建的权限类。这适用于更新和删除:

class LinkAssetPermission(permissions.BasePermission):
    message = 'Link access not allowed.'

    def has_object_permission(self, request, view, obj):
        return obj.content.delivery.owner == request.user and obj.content.delivery.can_change

我的问题,如果这个类对我的创建视图不起作用:

class AssetCreate(generics.CreateAPIView):
    """
    Link a new asset
    """
    queryset = Asset.objects.none()
    serializer_class = AssetSerializer
    permission_classes = (permissions.DjangoModelPermissions, LinkAssetPermission, )

obj.content.delivery.can_change返回false时,我无法创建,更新或删除模型对象。 obj.content.delivery.owner == request.user也是如此。我只能在用户是所有者时创建,更新或删除。所有这些工作正如我想要更新和删除,只是为了创建它不工作。可能是因为我还没有这个对象,这是我问题的核心。

创建时对象存在,我也尝试在return Falsehas_object_permission,我仍然可以创建记录。

我应该为插入创建一个新的权限类,还是应该在视图中更改某些内容?

感谢您的帮助

2 个答案:

答案 0 :(得分:2)

我发现了我必须做的事情。这是我的新权限类:

class LinkAssetPermission(permissions.BasePermission):
    message = 'Link access not allowed.'

    def has_permission(self, request, view):
        try:
            content = Content.objects.get(pk=request.parser_context["kwargs"]["content_id"])
        except:
            return False

        return content.delivery.owner == request.user and content.delivery.can_change

    def has_object_permission(self, request, view, obj):
        return obj.content.delivery.owner == request.user and obj.content.delivery.can_change

在创建方法时,不考虑has_object_permission,但是has_permission是。所以我检索从urls.py发送的参数,查询并检查我想要的对象的属性。

由于

答案 1 :(得分:0)

每当在通用视图中调用has_object_permissions()方法(即正在访问特定资源)时,都会调用

.get_object()

现在,所有detail个请求(retrieveupdatedelete)都可以访问特定的资源/对象。对于create个请求,get_object()方法不会被调用,因此在您的情况下它不起作用。

对于处理create请求,您可以创建另一个序列化程序,其中包含上述2个条件的验证。然后更改您的权限类以仅适用于detail个请求。