Django rest framework queryset自定义权限

Django rest framework queryset custom permissions

我想在我的 django rest 框架视图上使用 django guardian 设置自定义权限。我已经在 RetrieveModelMixin 中成功实现了它,但在 ListModelMixin 中却没有。

我有权限 class 看起来像这样:

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:我确定我遗漏了什么,我的问题很幼稚,但我看不出是什么。

好吧,覆盖并不可怕,具体取决于您的操作方式...但这不是问题所在。

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

我的建议是,为了让您的代码明确和简单,像 doc

中那样覆盖您的后端过滤器

但要小心 filter_queryset 应用于 retrievelist 方法

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