1

我想在我的 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可以根据 CustomPermhas_object_permission规则自行过滤对象。

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

有没有更好的办法 ?谢谢 :)

PS:我确定我遗漏了一些东西,我的问题很幼稚,但我看不出是什么。

4

2 回答 2

2

恐怕框架不能那样工作......权限在那里拒绝访问(当满足条件时),但不是为您过滤对象。如果需要返回特定对象,则需要根据当前用户在视图(查询集)中过滤它们(如果需要)。

于 2015-10-13T23:34:15.290 回答
0

根据您的操作方式,覆盖并不可怕……但这不是问题。

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

我的建议是,为了使您的代码保持明确和简单,请像在文档中一样覆盖您的后端过滤器

但要小心filter_queryset同时应用retrievelist方法

于 2015-10-13T13:18:18.140 回答