Python Django REST框架:在没有模型级权限的情况下使用对象级权限

Python Django REST框架:在没有模型级权限的情况下使用对象级权限,python,django,django-rest-framework,django-guardian,Python,Django,Django Rest Framework,Django Guardian,我有一个基于API的Django项目 最近,我使用启用了对象级权限。然而,我还没有在我的项目中使用它(直到现在我还没有看到它的任何用途。) 现在,当我在API视图集中打开时 class PhotoViewSet(viewsets.ModelViewSet) permission_classes = (permissions.DjangoObjectPermissions,) 并向端点发出一个更新请求,请求拥有Guardian框架的适当“更改”权限的对象,我得到一个403禁止的响应 这一

我有一个基于API的Django项目

最近,我使用启用了对象级权限。然而,我还没有在我的项目中使用它(直到现在我还没有看到它的任何用途。)

现在,当我在API视图集中打开时

class PhotoViewSet(viewsets.ModelViewSet)
    permission_classes = (permissions.DjangoObjectPermissions,)
并向端点发出一个更新请求,请求拥有Guardian框架的适当“更改”权限的对象,我得到一个
403禁止的
响应

这一反应的原因似乎在于:

  • 在这种情况下,DRF检查模型权限
  • djangObjectPermissions
    继承自
    djangModelPermissions
  • DRF调用DjangObjectPermissions.has_permission()
  • 具有\u权限()
    失败,因为我没有使用模型级权限
  • 在我的情况下,使用
    djangObjectPermissions
    的正确方法是什么

    • (A) 实现自定义权限类,从
      djangObjectPermissions
      继承它,并重写
      has\u permission()
    • (B) 打开Django的模型级权限框架只是为了它
    • (C) 使用此黑客跳过检查

    djangObjectPermissions
    的实现方式要求用户能够编辑模型,并且有权编辑该模型的实例

    >>> from django.contrib.auth.models import User, Group
    >>> user = User.objects.get(pk=1)
    >>> admins = Group.objects.get(pk=1)
    >>> user.has_perm('change_group')
    False
    >>> user.has_perm('change_group', admins)
    True
    
    管理模型权限会给项目增加(用户管理)开销。我建议,只有当你对项目的其余部分有需求并计划使用它时,才沿着这条路线走下去

    相反,创建一个完全符合您需要的自定义权限类似乎是最好的选择。它可以简单到:

    class ObjectOnlyPermissions(DjangoObjectPermissions):
    
        def has_permission(self, request, view):
            return True
    

    您引用的变通方法未记录,看起来是为了解决内部问题(正在筛选APIRootView端点列表)。我不会依靠这个来解决您的问题。

    看起来您在管理检索(admins->admin)中有一个输入错误。模型权限会增加什么样的开销?所谓开销,我指的是比代码开销更多的用户管理开销。您需要创建和管理组,为组分配用户,或者单独管理每个用户的权限。无论哪种方式,如果您的项目不需要这些功能(您只关心应用程序中的对象级权限),那么您将增加额外的复杂性和管理层。