自定义Django User与Group后无法获取组权限的问题
问题原因及解决方法
问题根源
你自定义的Group模型中,permissions字段设置了related_name="fk_group_permission",而Django内置的权限查询逻辑(比如get_group_permissions())依赖于原生Group模型与Permission模型关联的默认反向名称group_set。修改这个反向关联名称后,Django内部的查询语句无法正确匹配权限关联,进而触发类型错误。
另外,完全自定义AbstractGroup的实现方式,没有对齐原生Group的关联逻辑,也会导致内置权限方法处理查询时出现参数类型混淆。
解决步骤
移除自定义的related_name配置
修改AbstractGroup中的permissions字段,删除related_name="fk_group_permission",让Django使用默认的反向关联名称group_set:class AbstractGroup(models.Model): name = models.CharField(_("name"), max_length=150, unique=True) permissions = models.ManyToManyField( Permission, verbose_name=_("permissions"), blank=True, # 移除related_name配置 ) # 其他代码保持不变更稳妥的Group继承方式(可选)
如果你不需要自定义AbstractGroup,可以直接让Group继承原生django.contrib.auth.models.Group,再添加自定义字段is_active,这样能最大程度兼容内置权限系统:from django.contrib.auth.models import Group as BaseGroup class Group(BaseGroup): is_active = models.BooleanField(_("Is Active"), default=True)更新数据库结构
修改模型后执行迁移命令:python manage.py makemigrations python manage.py migrate
验证修改
完成上述操作后,重新调用a_user.get_group_permissions()或a_user.get_all_permissions(),即可正常获取组权限。
内容的提问来源于stack exchange,提问作者Mah Jal
相关产品推荐
相关产品推荐

