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

How to reference generated permissions in Django 1.7 migrations

我正在尝试创建一个 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 信号。

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

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

不过,您仍然可以这样做:

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

但是你要小心。

希望有人有用。