对Django Rest框架权限感到困惑

对Django Rest框架权限感到困惑,django,django-rest-framework,permissions,Django,Django Rest Framework,Permissions,我有一组复杂的权限,我想应用于我的视图,但我很难理解将它们放在哪里。这是我的基本权限 列出所有项目: 如果用户是所有者并且其帐户处于活动状态 或者如果他们是超级用户 并且该对象不是其他用户的私有对象 或者他们是指定组的成员 问题是,当我将此逻辑添加到ModelApiViewset的permissions类时,它会返回每个项目。我如何让它只显示符合上述标准的内容 为了进一步说明该示例,我现在有两个帐户:我的超级用户和一个测试用户。test_用户不是管理员或员工帐户,也不是manager组的一部

我有一组复杂的权限,我想应用于我的视图,但我很难理解将它们放在哪里。这是我的基本权限

列出所有项目:

  • 如果用户是所有者并且其帐户处于活动状态
  • 或者如果他们是超级用户
  • 并且该对象不是其他用户的私有对象
  • 或者他们是指定组的成员
问题是,当我将此逻辑添加到ModelApiViewset的permissions类时,它会返回每个项目。我如何让它只显示符合上述标准的内容

为了进一步说明该示例,我现在有两个帐户:我的超级用户和一个测试用户。test_用户不是管理员或员工帐户,也不是manager组的一部分。test_用户帐户是项目2的所有者,但不是项目1的所有者。但是如果我使用test_用户凭据,我会看到项目1和项目2:

[
    {
        "id": 1,
        "name": "Test Private Project",
        "slug": "test-private-project",
        "description": "Just testing the super private project",
        "group": {
            "name": "manager",
            "id": 1
        },
        "created_date": "2020-04-20T18:04:20.666564Z",
        "modified_date": "2020-04-20T18:04:20.666594Z",
        "owner": {
            "username": "admin",
            "full_name_display": "Administrator",
            "photo": null,
            "is_active": true,
            "id": 1
        },
        "is_private": true
    },
    {
        "id": 2,
        "name": "Test User Project",
        "slug": "test-user-project",
        "description": "Test project for users",
        "group": {
            "name": "Users",
            "id": 2
        },
        "created_date": "2020-04-20T20:10:02.068390Z",
        "modified_date": "2020-04-20T20:10:02.068429Z",
        "owner": {
            "username": "test_user",
            "full_name_display": "Test User",
            "photo": null,
            "is_active": true,
            "id": 2
        },
        "is_private": false
    }
]
test_用户不应该看到项目1,因为他们不是所有者,也不是管理员,并且项目对管理员是私有的

视图:

权限:

class IsOwner(BasePermission):
    def has_object_permission(self, request, view, obj):
        return obj.owner == request.user


class IsActive(BasePermission):
    def has_object_permission(self, request, view, obj):
        return request.user.is_active


class IsPrivatelyOwned(BasePermission):
    def has_object_permission(self, request, view, obj):
        if obj.is_private:
            if obj.owner == request.user:
                return True
            return False
        return True

我知道我遗漏了一些很简单的东西,但我似乎无法理解。任何帮助都将不胜感激。提前谢谢。

我想你误解了什么是权限。权限和筛选器是两种不同的东西。权限控制访问数据库中对象的权限

:
还请注意,通用视图将仅检查检索单个模型实例的视图的对象级权限。如果需要列表视图的对象级过滤,则需要单独过滤查询集。有关详细信息,请参阅文档。

我认为您是正确的。我被这种差异弄糊涂了。谢谢你的帮助。
class IsOwner(BasePermission):
    def has_object_permission(self, request, view, obj):
        return obj.owner == request.user


class IsActive(BasePermission):
    def has_object_permission(self, request, view, obj):
        return request.user.is_active


class IsPrivatelyOwned(BasePermission):
    def has_object_permission(self, request, view, obj):
        if obj.is_private:
            if obj.owner == request.user:
                return True
            return False
        return True