Django休息框架queryset自定义权限

时间:2015-10-12 22:39:34

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

我想在django rest框架视图中使用django guardian设置自定义权限。我已成功实现RetrieveModelMixin,但不是ListModelMixin

我的权限类看起来像这样:

class CustomPerm(permissions.BasePermission):
    def has_permission(self, request, view):
        return request.user and request.user.is_authenticated()

    def has_object_permission(self, request, view, object):
        if request.method == 'GET':
            if object.public is True:
                return True

            if object.user.is_staff is True:
                return True

            if 'read_object' in get_perms(request.user, object):
                return True

            return False

        if request.method == 'POST':
            #...

我还简化了这里的观点:

@authentication_classes((TokenAuthentication, SessionAuthentication, BasicAuthentication,))
@permission_classes((CustomPerm,))
class ObjectView(ListModelMixin,
                 RetrieveModelMixin,
                 viewsets.GenericViewSet):
    queryset = myObject.objects.all()
    serializer_class = ObjectSerializer

我天真期待的行为:ListModelMixin可以根据CustomPerm has_object_permission规则自行过滤对象。

但它并不像那样。我可以通过编写get_queryset方法并应用我的自定义权限规则来做我想做的事情,但它似乎不合适而且糟糕。

有更好的方法吗?谢谢:))

PS:我确定我错过了什么,我的问题很天真,但我看不清楚。

2 个答案:

答案 0 :(得分:1)

我担心框架不能以这种方式工作......权限是拒绝访问(当条件满足时),而不是为您过滤对象。如果需要返回特定对象,则需要根据当前用户(如果需要)在视图(queryset)中对其进行过滤。

答案 1 :(得分:0)

根据你的表现,改写不是很糟糕......但这不是问题。

如果我完全理解您要做的是使用自定义权限过滤您的查询集。

我建议,为了使您的代码明确而简单,请覆盖您的后端过滤器,如doc

但要小心filter_queryset适用于retrievelist方法