由于不推荐使用 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
复制回来并运行 再次迁移
,一切正常,组以我想要的方式创建。
为了让迁移一步到位,必须更改什么?
最佳答案
权限在 post_migrate
信号触发时创建。仅当当前运行中的所有迁移都已完成时才会触发此信号。您不能依赖迁移中存在的权限。
创建权限的信号接收器会检查现有权限,因此如果权限尚不存在,您可以自己简单地创建权限。
最好添加对 ('auth', '__latest__')
的依赖,以确保权限模型的迁移已运行并且至少该表存在。
关于python - Django:为初始组提供迁移,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30958024/