定义默认组和权限的最简单方法是什么?

3 投票
1 回答
2313 浏览
提问于 2025-04-18 23:22

目标

能够自动创建几个带有预定义权限的用户组(包括通过 django.contrib.auth.signals 自动创建的权限)。

我的困扰

看起来有两种方法可以做到这一点:

  1. 使用数据文件(fixtures)
  2. 使用信号(signals)

选择第一种方法会遇到以下问题:

  • 你无法提前知道预定义权限的ID(比如 add_, delete_, change_),除非你先运行一次脚本,然后把ID记下来。
  • 如果你决定自己创建权限,你也不知道该如何在数据文件中填充 "pk" 字段,因为有些权限已经被创建了。

选择第二种方法的问题是:

  • 你的信号会在其他信号之前运行,包括 django.contrib.auth.signals,因此你无法调用它的预定义权限并将它们添加到你的用户组中。

不仅如此,使用简单的:

def create_initial_groups(**kwargs):
    staff_group     = Group(name = 'Staff')
    clients_group   = Group(name = 'Clients')

    staff_group.save()
    clients_group.save()

和:

signals.post_syncdb.connect(
    create_initial_groups,
    dispatch_uid = 'unique_app_identifier.listeners.create_initial_groups'
)

我会遇到:

django.db.utils.IntegrityError: duplicate key value violates unique constraint "auth_group_name_key" DETAIL: Key (name)=(Staff) already exists.

即使是在一个干净的数据库中(在 psql 中运行 drop schema public cascade; create schema public; 之后,再运行 python manage.py syncdb)。

问题

那么,如果有的话,最简单的方法是什么,以便预先填充数据库,创建几个用户组和权限?

1 个回答

1

如果你能把这些自定义权限和你的模型关联起来,可以试着在模型的 Meta 类里面定义它们,具体可以参考 权限属性

为你的自定义组创建一些数据文件,但在序列化的时候要使用 自然键,这样它们就可以通过名字而不是主键来引用相关的权限。

撰写回答