Permissions django guardian和django rest框架

Permissions django guardian和django rest框架,permissions,django-rest-framework,django-guardian,Permissions,Django Rest Framework,Django Guardian,我想在restful项目中使用django guardian(使用django rest框架)管理我的对象权限 我想要的是: 仅当连接的用户具有 “添加\u modelname”权限 当连接的用户创建对象时,设置“delete_modelname” 和“更改模型名”权限 仅当连接的用户具有 “更改模型对象”权限 仅当连接的用户具有 “删除\u模型对象”权限 我正在尝试使用以下代码管理这些案例: request.user.has_perm('view_coachingrequest') vi

我想在restful项目中使用django guardian(使用django rest框架)管理我的对象权限

我想要的是:

  • 仅当连接的用户具有 “添加\u modelname”权限
  • 当连接的用户创建对象时,设置“delete_modelname” 和“更改模型名”权限
  • 仅当连接的用户具有 “更改模型对象”权限
  • 仅当连接的用户具有 “删除\u模型对象”权限
我正在尝试使用以下代码管理这些案例:

request.user.has_perm('view_coachingrequest')
view.py

class ModelNameViewSet(viewsets.ModelViewSet):
    """
    This viewset automatically provides `list`, `create`, `retrieve`,
    `update` and `destroy` actions.

    Additionally we also provide an extra `highlight` action.
    """
    queryset = ModelName.objects.all()
    serializer_class = ModelNameSerializer
    permission_classes = (permissions.IsAuthenticatedOrReadOnly, ModelNamePermission)

    def create(self, request, *args, **kwargs):
        assign_perm("change_modelname", request.user, self)
        assign_perm("delete_modelname", request.user, self)
        return super().create(request, *args, **kwargs)
权限.py

class ModelNamePermission(permissions.BasePermission):
    """
    Custom permission to only allow owners of an object to edit it.
    """

    def has_permission(self, request, view):
        if request.method in ['GET']:
            return request.user.has_perm('view_modelname')        
        if request.method in ['POST']:
            return request.user.has_perm('add_modelname')
        if request.method in ['PUT', 'PATCH']:
            return request.user.has_perm('change_modelname')
        if request.method in ['DELETE']:
            return request.user.has_perm('delete_modelname')
        return False

    def has_object_permission(self, request, view, obj):         
        if request.method in ['GET']:
            return request.user.has_perm('view_modelname', obj)        
        if request.method in ['POST']:
            return request.user.has_perm('add_modelname', obj)
        if request.method in ['PUT', 'PATCH']:
            return request.user.has_perm('change_modelname', obj)
        if request.method in ['DELETE']:
            return request.user.has_perm('delete_modelname', obj)
        return False
我遇到的第一个问题是,我在这行中有一个错误:

assign_perm("change_modelname", request.user, self)
错误:

error: 'ModelNameViewSet' object has no attribute '_meta'
我认为代码的其余部分将不起作用,但至少你可以看到我想要做什么

我没有看到任何关于这些具体案例的例子

编辑: 另一件事是这个代码:

request.user.has_perm('view_coachingrequest')

一切都是真的。但我从未将此权限设置为我的用户(仅尝试使用admin user,可能这就是原因)。

视图集的
create
方法将返回一个新创建的模型实例。您正在尝试将权限分配给viewset对象本身。
create
方法的代码应如下所示:

def create(self, request, *args, **kwargs):
    instance = super().create(request, *args, **kwargs)
    assign_perm("change_modelname", request.user, instance)
    assign_perm("delete_modelname", request.user, instance)
    return instance

这将创建模型实例,然后在返回它之前为它分配所需的权限。

我想做完全相同的事情。完成了吗?DRF视图集中的create方法返回一个响应对象,而不是模型的实例。这里的代码:您在考虑序列化程序中的create方法吗?实际上,它可以在序列化程序中完成,也可以在viewset上的perform_create()方法中完成(后者由这里的答案显示:)。因此,您可以选择将代码保存在何处。对我来说,我想我应该在序列化程序中完成这项工作(这可能允许您编写更清晰的错误处理代码,将对象创建与权限分配放在同一位置)