Skip to main content
 首页 » 编程设计

python之如何在 Django 1.7 迁移中引用生成的权限

2025年05月04日38freeliver54

我正在尝试通过迁移自动创建具有权限的 auth.Group。我的问题是,当我在空数据库上运行迁移时,试图将权限附加到组的迁移找不到权限。如果我以较早的迁移为目标,以便迁移退出时没有错误,则权限会出现在数据库中,之后迁移代码可以找到该权限。那么我该怎么做才能让迁移可以引用在迁移背靠背运行时在早期迁移中创建的权限?

def load_data(apps, schema_editor): 
    Permission  = apps.get_model('auth', 'Permission') 
    Group       = apps.get_model('auth', 'Group') 
 
    can_add = Permission.objects.get(codename='add_game') 
    developers = Group.objects.create(name='Developer') 
 
    developers.permissions.add(can_add) 
    developers.save() 
 
 
class Migration(migrations.Migration): 
 
    dependencies = [ 
        ('myApp', '0004_game'), 
    ] 
 
    operations = [ 
        migrations.RunPython(load_data), 
    ] 

游戏模型是在较早的迁移中创建的。当我在空数据库上与其他迁移一起运行时,此代码总是导致错误,指出权限匹配查询不存在。 我正在使用 python 3.4 和 django 1.7.2

请您参考如下方法:

哦。 4年后... Django 使用 post_migrate 创建权限信号。

因此,当一次运行所有迁移时,权限还不存在。

因此,你可以把你的功能拿出来,比如在management命令中。

但是,您仍然可以这样做:

from django.contrib.auth.management import create_permissions 
 
 
APPS = [ 
    ...your app labels 
] 
 
 
def create_applications_permissions(): 
    for app in APPS: 
        app_config = django_apps.get_app_config(app) 
        create_permissions(app_config) 
 
 
def load_data(apps, schema_editor): 
    create_applications_permissions() 
    Permission  = apps.get_model('auth', 'Permission') 
    Group       = apps.get_model('auth', 'Group') 
 
    can_add = Permission.objects.get(codename='add_game') 
    developers = Group.objects.create(name='Developer') 
 
    developers.permissions.add(can_add) 
    developers.save() 
 
 
class Migration(migrations.Migration): 
 
    dependencies = [ 
        ('myApp', '0004_game'), 
    ] 
 
    operations = [ 
        migrations.RunPython(load_data), 
    ] 

并且要创建权限,请不要使用传递给迁移的应用程序。不会通过create_permissions中的检查:

if not app_config.models_module: 
    return 

但你必须要小心。

希望有人有用。