Django rest框架queryset自定义权限



我想在我的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

行为我naïvly期望:ListModelMixin可以根据CustomPerm has_object_permission规则自行过滤对象。

但事实并非如此。我可以通过编写get_queryset方法并应用我的自定义权限规则来做我想做的事情,但这似乎不合适且糟糕。

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

PS:我确信我错过了一些东西,我的问题是naïve,但我看不到什么。

恐怕这个框架不是这样工作的…权限用于拒绝访问(当满足条件时),而不是为您过滤对象。如果需要返回特定对象,则需要根据当前用户在视图(queryset)中对它们进行过滤(如果需要的话)。

重写并不可怕,取决于你怎么做…但这不是问题所在。

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

我的建议是,为了保持你的代码明确和简单,重写你的后端过滤器,就像在doc

但是要注意filter_queryset同时应用于retrievelist方法

相关内容

  • 没有找到相关文章

最新更新