Django REST 框架:使用对象级权限而不使用模型级权限

Django REST framework: using object-level permissions without model-level permissions

我有一个 Django 项目 API 基于 Django REST framework.

最近我在我的项目中使用 django-guardian. However I'm not using model-level permissions framework 启用了对象级权限(直到这一刻我还没有看到任何目的。)

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

class PhotoViewSet(viewsets.ModelViewSet)
    permission_classes = (permissions.DjangoObjectPermissions,)

并向端点发出更新请求,以获取具有来自 Guardian 框架的适当 "change" 权限的对象,我收到了 403 FORBIDDEN 响应。

此响应的原因似乎在于 request dispatch stage:

  1. 在这种情况下,DRF 检查模型权限。
  2. DjangoObjectPermissions 继承自 DjangoModelPermissions.
  3. DRF 调用 DjangoObjectPermissions.has_permission()
  4. has_permission() 失败,因为我没有使用模型级权限。

在我的情况下,DjangoObjectPermissions 的正确使用方法是什么?

DjangoObjectPermissions 的实现方式希望用户能够编辑模型并有权编辑该模型的实例。

>>> 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 似乎是最好的方法。它可以很简单:

class ObjectOnlyPermissions(DjangoObjectPermissions):

    def has_permission(self, request, view):
        return True

您引用的解决方法未记录在案,看起来是为了解决内部问题(APIRootView 端点列表被过滤)。我不会依赖它来解决您的问题。