DRF-如何在queryset上实现基于对象的权限?

时间:2019-02-20 10:56:03

标签: django django-rest-framework django-permissions

我按照文档实施了DRF。我发现,一旦验证了用户身份,就可以允许用户获取系统中任何用户的数据。

我已经按照this文档实施了过滤。

我仔细阅读了权限文档,找不到基于所有者过滤掉查询集的方法。在我的一种视图中,我正在检查所有者是否与请求的用户相同。

我的问题是,我是否必须在所有视图集中都这样做?或有一种通用的方法可以检查这种情况?

2 个答案:

答案 0 :(得分:1)

不确定,这是否是最好的方法,但是我通过覆盖get_queryset来做到这一点

f(g)

使用权限类进行操作

def get_queryset(self):
    queryset = YOUR_MODEL.objects.filter(user_id=self.request.user.id)
    return queryset

一些解释。 class IsInUserHierarchy(permissons.BasePermission): def has_permission(self, request, view): return bool(isinstance(request.user, UserClassHierarchy)) 类与IsInUserHierarchy非常相似。它使用简单的python isinstance()方法检查request.user是否在所需的类中(从模型中导入IsAdminUser

答案 1 :(得分:0)

只需创建一个权限文件,然后添加以下内容:

class IsOwner(permissions.BasePermission):

    def has_object_permission(self, request, view, obj):
        # Instance must have an attribute named `owner`.
        return obj.owner == request.user

然后,在您的ViewSet中,使用以下权限类:

class MyViewSet(viewsets.ViewSet):
    permission_classes = (IsOwner,)

现在,只需将权限文件导入您想使用此逻辑的任何位置,而不必重复任何代码