由于不推荐使用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
,一切正常,组创建于我想要的方式。
为了让迁移只在一个步骤中运行,必须更改哪些内容?
答案 0 :(得分:3)
post_migrate
信号触发时会创建权限。仅当当前运行中的所有迁移都已完成时,才会触发此信号。您不能依赖迁移中存在的权限。
创建权限的信号接收器会检查现有权限,因此您可以自行创建权限(如果尚未存在)。
最好在('auth', '__latest__')
上添加依赖项,以确保Permission模型的迁移已运行且至少表存在。