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