【问题标题】:right way to create a django data migration that creates a group?创建创建组的django数据迁移的正确方法?
【发布时间】:2016-02-02 19:11:14
【问题描述】:

我想创建创建权限和组的数据迁移,以便我的其他开发人员可以运行迁移并设置所有内容。我能够创建迁移并正常运行它们,但现在运行测试时出现错误。

但如果我这样做:

from django.contrib.auth.models import Group

def add_operations_group(apps, schema_editor):
    Group.objects.get_or_create(name='operations')

我明白了:

django.db.utils.OperationalError: no such table: auth_group

如果我这样做:

def add_operations_group(apps, schema_editor):
    Group = apps.get_model("django.contrib.auth", "group")
    Group.objects.get_or_create(name='operations')

我明白了:

LookupError: No installed app with label 'django.contrib.auth'

有没有办法做到这一点?或者是否有“Django 方式”来确保创建权限和组等内容?

【问题讨论】:

    标签: django django-migrations


    【解决方案1】:

    这就是我的做法:

    from django.db import models, migrations
    
    
    def apply_migration(apps, schema_editor):
        Group = apps.get_model('auth', 'Group')
        Group.objects.bulk_create([
            Group(name=u'group1'),
            Group(name=u'group2'),
            Group(name=u'group3'),
        ])
    
    
    def revert_migration(apps, schema_editor):
        Group = apps.get_model('auth', 'Group')
        Group.objects.filter(
            name__in=[
                u'group1',
                u'group2',
                u'group3',
            ]
        ).delete()
    
    
    class Migration(migrations.Migration):
    
        dependencies = [
            ('someapp', 'XXXX_some_migration'),
        ]
    
        operations = [
            migrations.RunPython(apply_migration, revert_migration)
        ]
    

    虽然,肯定有更 Djangonic 的方式。

    【讨论】:

    • 德拉特。我按照你的方法试过了,但我仍然收到“没有安装标签为 'auth' 的应用”
    • ` from django.conf import settings class Migration(migrations.Migration): dependencies = [ migrations.swappable_dependency(settings.AUTH_USER_MODEL), ('someapp', 'XXXX_some_migration'), ]` 添加引用django auth 依赖模型
    • 很好,谢谢!但是为什么我们需要恢复迁移呢?
    【解决方案2】:

    César 的回答是正确的。为了让它更丰富,Django 会自动创建迁移文件,方法是转到您的 django 应用程序根文件夹并输入:

    python manage.py makemigrations <yourappname> --empty
    

    注意:根据您的系统配置,您可能需要 python3 而不是 python。

    这会在您应用的子目录中创建一个名为 0001_initial.py 的空迁移文件

    然后您可以按照 César 的说明对其进行更改。与 Django 2.2 一起正常工作

    【讨论】:

      猜你喜欢
      • 2016-10-27
      • 2021-08-16
      • 2016-06-06
      • 1970-01-01
      • 1970-01-01
      • 2015-09-15
      • 2016-04-02
      • 2021-04-29
      • 2021-03-02
      相关资源
      最近更新 更多