python - Django:为初始组提供迁移

标签 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 复制回来并运行 再次迁移,一切正常,组以我想要的方式创建。

为了让迁移一步到位,必须更改什么?

最佳答案

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

创建权限的信号接收器会检查现有权限,因此如果权限尚不存在,您可以自己简单地创建权限。

最好添加对 ('auth', '__latest__') 的依赖,以确保权限模型的迁移已运行并且至少该表存在。

关于python - Django:为初始组提供迁移,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30958024/

相关文章:

Python:捕获git错误

python - 在 Cartopy、Robinson 投影中绘制直线

python - 使用 NLTK 生成二元语法

python - 哪个是检查请求条件的更好方法?

django - 使用South和Django显式设置MySQL表存储引擎

python - 如何从指向字符串的 PyObject 获取 char*

python - 查询集 : Compare a field with a substring of another field of the same model

django - 为 django 项目安装 memcached

python - Django 是否支持在许多非抽象模型之后继承的模型类?

database - 过滤和区分的django查询