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

时间:2014-08-30 13:57:26

标签: python django permissions

目标

能够自动创建具有预定义权限的少数组(包括django.contrib.auth.signals自动创建的权限)。

我的奋斗

显然有两种方法可以做到这一点:

  1. 夹具
  2. 信号
  3. 使用第一个选项的问题是:

    • 您不可能事先知道(除了可能通过运行脚本一次并在纸上注明ID),预定义权限的ID是什么(add_delete_change_)。 -
    • 如果您决定创建自己的权限,您也不知道如何填充灯具中的"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:重复键值违反唯一   约束" auth_group_name_key"细节:钥匙(姓名)=(工作人员)已经   存在。

    即使使用干净的数据库(在drop schema public cascade; create schema public;之前psql上运行python manage.py syncdb)。

    问题

    那么,用最少的组和权限预填充数据库的最简洁方法是什么?如果有的话?

1 个答案:

答案 0 :(得分:1)

如果您可以将这些自定义权限与模型相关联,请尝试在permissions attribute inside model's Meta类下定义它们。

为自定义组创建灯具,但在序列化时使用natural keys,以便他们按名称而不是pk引用相关权限。