Django rest框架queryset自定义权限

Django rest框架queryset自定义权限,django,permissions,django-rest-framework,django-guardian,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.i

我想在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\u object\u permission
规则自己过滤对象

但它不是这样工作的。通过编写
get\u queryset
方法并应用我的自定义权限规则,我可以做我想做的事情,但这似乎不合适,也很糟糕

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


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

好吧,覆盖并不可怕,这取决于你是如何做的。。。但这不是问题所在

如果我很清楚,您要做的是使用自定义权限筛选查询集

我的建议是,为了保持代码的明确性和简单性,像


但是要小心
filter\u queryset
retrieve
list
方法上都应用
。。。这些权限用于拒绝访问(当满足条件时),但不用于为您筛选对象。如果需要返回特定对象,则需要根据当前用户在视图(queryset)中过滤它们(如果需要)。

我已经实现了一个基于过滤器的解决方案,该解决方案使用了您描述的权限,这就是我需要的。我只是对“权限”语义有点问题,但现在没问题了。Thx你们两个:)听到这个消息很高兴!祝你好运