【发布时间】:2018-03-16 13:26:47
【问题描述】:
我想在 Django/DRF 中实现以下目标:
实现一个端点,给定用户的 id,返回其权限列表。 (我的意思是User 和Permission 来自django.contrib.auth.models 的模型)。
现在,这很简单,我可以使用下面的代码获得那些:
class UserPermissions(RetrieveUpdateDestroyAPIView):
serializer_class = PermissionSerializer
def get(self, request, pk):
permissions = User.objects.get(pk=pk).get_all_permissions()
print User.objects.get(pk=pk).user_permissions
data = {
'permissions': permissions
}
serializer = PermissionSerializer(data)
return Response(serializer.data, status=status.HTTP_200_OK)
这是我得到的回应:
{
"permissions": [
"auth.add_user",
"auth.add_group",
"auth.add_userproxy",
"auth.change_group",
"auth.change_user",
"auth.delete_permission",
"evidence.view_all_customers"
]
}
然而,这并不是我想要的。我想返回系统中所有权限的列表,并为给定用户的每个单独权限提供一个真/假值。
当然,我尝试获取完整的权限列表以将它们与用户的权限进行比较,但这是我偶然发现的一个问题:
来自django.contrib.auth.models的Permission模型,我可以从中获得系统中的完整权限列表,具有以下属性:
name、content_type 和 codename。我发现 codename 是我需要的属性,但有一个问题 - 它包含没有前置应用程序名称的名称(例如,只是“add_user”,而不是 User.get_all_permissions() 返回的“auth.add_user”。
这基本上使两者无法比拟。有没有办法很好地做到这一点?我只想将子字符串匹配作为最后的手段,因为我认为这不是一个好习惯。
编辑:根据要求,这是一个示例:
假设系统中有以下权限:
"auth.add_user",
"auth.add_group",
"auth.add_userproxy",
"auth.change_group",
"auth.change_user",
"auth.delete_permission",
"evidence.view_all_customers"
"contenttypes.add_contenttype",
"evidence.view_all_demands",
"evidence.delete_supplier"
我想创建一个端点,给定一个用户 ID,它会返回以下内容:
{
"permissions": {
"auth.add_user" : True,
"auth.add_group" : True,
"auth.add_userproxy" : False,
"auth.change_group" : False,
"auth.change_user" : True,
"auth.delete_permission" : False,
"evidence.view_all_customers" : False,
"contenttypes.add_contenttype" : True,
"evidence.view_all_demands" : False,
"evidence.delete_supplier" : True,
}
}
【问题讨论】:
-
可以用您的输入和预期输出更新问题吗?
标签: django django-rest-framework