如何在Django中通过编程方式创建用户组并验证生效
Django编程创建版主用户组常见问题解答
1. 创建用户组的代码应该放在哪个文件?
- 最规范的方案是放在自定义数据迁移文件中,就是你附的参考代码的实现方式:在任意应用的migrations目录下新建迁移文件,通过
migrations.RunPython执行创建逻辑。这种方式的优势是和项目版本绑定,执行python manage.py migrate时会自动运行,且只会执行一次,回滚迁移时也可以同步删除创建的用户组。 - 如果是临时一次性创建,可以直接进入Django Shell执行代码:运行
python manage.py shell后粘贴你的示例代码即可。 - 不建议直接把代码放在模块顶层(比如models.py、views.py的全局位置),否则每次项目启动都会重复执行,虽然
get_or_create不会重复创建用户组,但会产生不必要的数据库查询。
2. 代码创建的用户组是否会在admin后台展示?如何确认创建成功?
- 默认会在后台展示:只要你
INSTALLED_APPS中开启了django.contrib.auth和django.contrib.admin,Django默认会自动注册用户组的管理入口,你可以在后台「认证和授权」分类下看到「组」列表,所有代码创建的组都会在这里展示。如果看不到,先排查当前登录的后台用户是否有查看用户组的权限,或者是否有代码取消了Group模型的admin注册。 - 其他确认方式:
- 进入Django Shell执行
Group.objects.filter(name='你的组名').exists(),返回True则说明创建成功。 - 直接查询数据库的
auth_group表,对应名称的记录存在即为创建成功。
- 进入Django Shell执行
3. 是否可以在任意应用中创建用户组?写在无模型的users应用的views.py中是否生效?
- 可以在任意应用中操作用户组:Django的
Group是全局的系统模型,和你在哪个应用下执行代码没有关系,哪怕你的users应用没有定义任何模型,也可以正常调用Group的相关接口。 - 写在views.py中可以生效,但有前提:你写的创建代码必须被触发才会执行,比如你把代码放在某个视图函数里,只有当这个视图被访问的时候,创建逻辑才会运行。但非常不推荐这么做:
- 视图每次被访问都会执行一次代码,其中
Permission.objects.create重复执行会抛出唯一键冲突错误,因为权限的codename是全局唯一的,哪怕你给Group用了get_or_create,权限创建逻辑还是会报错。 - 业务逻辑和初始化逻辑耦合,后续维护成本高。
- 视图每次被访问都会执行一次代码,其中
示例代码优化建议
你给出的示例代码中,创建权限的逻辑建议替换为get_or_create,避免重复执行报错:
from django.contrib.auth.models import Group, Permission from django.contrib.contenttypes.models import ContentType from api.models import Project new_group, created = Group.objects.get_or_create(name='版主') ct = ContentType.objects.get_for_model(Project) # 权限也用get_or_create避免重复创建报错 permission, _ = Permission.objects.get_or_create( codename='can_add_project', name='Can add project', content_type=ct ) new_group.permissions.add(permission)
内容的提问来源于stack exchange,提问作者John DOe
相关产品推荐
相关产品推荐

