什么是以编程方式向组添加权限的正确方法

时间:2013-01-21 10:34:05

标签: django permissions

我想在群组中添加(已经存在,通过元标记中的权限定义)权限,并寻找正确的位置。我必须确保在sync_db命令之后所有组都分配了正确的权限。

我正在考虑连接一个post_syncdb信号,但信号文档说:

  

此信号的处理程序执行幂等非常重要   更改(例如,没有数据库更改),因为这可能导致刷新   管理命令如果在syncdb命令期间也运行则失败。

因此,有人可能不建议有人在通过sync_db_post信号调用的管理命令中为组添加权限。

我打算像这样设置权限:

class UserProfile(models.Model):
    user = models.OneToOneField(User)
    company = models.ForeignKey(Company, related_name='user_profiles')
    department = models.ForeignKey(Department, related_name='user_profiles')

    class Meta:
        permissions = (
            ('admin_section_access', 'Access to front-end admin section'),
        )
管理命令中的

from django.core.management.base import BaseCommand, CommandError
from django.contrib.auth.models import Group, Permission
from django.contrib.contenttypes.models import ContentType


class Command(BaseCommand):
    args = 'none'
    help = 'Sets the defined group permissions'

    def handle(self, *args, **options):
        front_end_admin_group, created = Group.objects.get_or_create(name="Front End Admin")

        #get the content type for the UserProfile model
        user_profile_ct = ContentType.objects.get(app_label='organization', model='userprofile')
        admin_section_access_perm = Permission.objects.get(content_type=user_profile_ct, codename="admin_section_access")
        front_end_admin_group.permissions.add(admin_section_access_perm)
        self.stdout.write('Successfully setup group permissions.')

1 个答案:

答案 0 :(得分:0)

这里有两个主要选项。第一个是为数据库创建一个fixture,如Django文档中的here所述。这是将数据(对于您,权限外部参照记录)种植到数据库中的最早方式。

第二个选项,也是我首选的选项,是使用South以编程方式跟踪和维护对数据库的更改。虽然最常用于架构更改,但其data migrations功能是完美处理您想要的内容。您可以在命令行中运行它:./manage.py datamigration my_app seed_permissions然后只需编写所需的Django代码,即可在提供的forwards函数中获得您的权限。

第二个选项的主要问题是它要求你在migrate之后运行sync_db的附加命令,但这可能是不可避免的,因为南方是真理(并且计划成为核心) Django在1.7)。