Django:为初始组提供迁移

时间:2015-06-20 19:26:37

标签: python django django-models django-migrations

由于不推荐使用initial_data灯具,我试图通过迁移添加初始数据。

我创建了我的模型,其中一个模型包含一个代号为can_use_feature的权限。

当我运行makemigrations时,会创建0001_initial.py迁移。 migrate命令创建数据库,填充良好,上面的权限位于auth_permission表中。

现在我希望在数据库中默认拥有一个具有该权限的组,因此我将此迁移创建为0002_default_group.py

from __future__ import unicode_literals
from django.db import migrations


def create_default_group(apps, schema_editor):

    GroupModel = apps.get_model('auth', 'group')

    group = GroupModel(name='My Group')
    group.save()

    PermissionModel = apps.get_model('auth', 'permission')
    permission = PermissionModel.objects.get(codename='can_use_feature')
    group.permissions.add(permission)


class Migration(migrations.Migration):

    dependencies = [
        ('myapp', '0001_initial'),
    ]

    operations = [
        migrations.RunPython(create_default_group),
    ]

现在出现了一些神秘的事情:当我再次删除数据库并执行migrate命令时,会出现DoesNotExist错误,就在permission = PermissionModel.objects.get(codename='can_use_feature')行。

当我删除0002_default_group.py时,删除数据库,执行migrate,再次复制0002_default_group.py并再次运行migrate,一切正常,组创建于我想要的方式。

为了让迁移只在一个步骤中运行,必须更改哪些内容?

1 个答案:

答案 0 :(得分:3)

post_migrate信号触发时会创建权限。仅当当前运行中的所有迁移都已完成时,才会触发此信号。您不能依赖迁移中存在的权限。

创建权限的信号接收器会检查现有权限,因此您可以自行创建权限(如果尚未存在)。

最好在('auth', '__latest__')上添加依赖项,以确保Permission模型的迁移已运行且至少表存在。