问题描述
因此,我扩展了Django的Group
模型来添加一个额外的字段,如下所示:
class MyModel(Group):
extra_field = models.TextField(null=True,blank=True)
这样做时,创建的MyModel
的每个实例也会创建一个Group
实例。
如果我使用user.groups.add(group)
将用户添加到结果组中,则该组将按预期添加。
但是,MyModel组的权限似乎并没有渗透到用户,即
执行user.get_all_permissions()
,get_group_permissions()
甚至测试user.has_permission(mygroup_permission)
都不会返回任何结果。仅显示 pure 组实例(在扩展模型之前创建)的权限。
TIA
解决方法
查看默认的django身份验证后端ModelBackend
时,您会看到以下内容:
def _get_group_permissions(self,user_obj):
user_groups_field = get_user_model()._meta.get_field('groups')
user_groups_query = 'group__%s' % user_groups_field.related_query_name()
return Permission.objects.filter(**{user_groups_query: user_obj})
很明显,它试图从代表用户组(此处为 groups )的字段中确定权限。由于您的MyModel
与djangos用户模型无关,因此您将不会以这种方式获得任何权限。
您现在可以:
- 编写自定义用户模型并替换组 的关系
- 编写自定义身份验证后端
- 使用从MyModel到组的一对一关系
我认为,最简单的方法是在一对一关系中用新模型扩展Group模型。这样,您就可以进一步使用djangos身份验证系统并获得其他可用数据。