【问题标题】:How to disable migrations for specific Django 1.7 apps?如何禁用特定 Django 1.7 应用程序的迁移?
【发布时间】:2017-07-25 13:32:22
【问题描述】:

如何在 Django>=1.7 中禁用特定应用的迁移?

我正在尝试从 Django 1.6 升级到 1.7,并且我对 Django 的身份验证应用程序进行了一些微不足道的更改以更改标签,但是 Django>=1.7 中的一个设计缺陷现在将所有属性视为数据库模式的一部分,从而触发新的迁移。此外,运行manage.py makemigration myapp 会为所有其他触及myapp 的应用程序生成迁移,因此即使我没有明确尝试为auth 创建迁移,它也迫使我这样做,我看不出有什么办法关闭。

这造成了严重破坏,因为我有十几个应用程序涉及auth,所以这导致 Django 创建了十多个毫无意义的迁移。

我尝试使用MIGRATION_MODULES 创建自定义auth 迁移目录,但似乎不起作用。任何依赖 auth 的应用程序现在都会抛出如下错误:

ValueError: Lookup failed for model referenced by field helpdesk.Queue.group: auth.Group

如果我尝试迁移 auth。我该如何解决?理想情况下,最简单的解决方案是“关闭”auth 的迁移,因为我实际上并没有对其进行任何更改。

编辑:这是 Django 强制我生成的自定义迁移:

class Migration(migrations.Migration):

    dependencies = [
        ('admin', '0001_initial'),
        ('auth', '0001_initial'),
    ]

    operations = [
        migrations.CreateModel(
            name='LogEntry',
            fields=[
            ],
            options={
                'ordering': ('-action_time',),
                'verbose_name': 'log entry',
                'proxy': True,
                'verbose_name_plural': 'log entries',
            },
            bases=('admin.logentry',),
        ),
        migrations.AlterField(
            model_name='permission',
            name='name',
            field=models.CharField(max_length=500, verbose_name='name'),
            preserve_default=True,
        ),
        migrations.AlterField(
            model_name='user',
            name='username',
            field=models.CharField(help_text='Required. 30 characters or fewer. Letters, digits and @/./+/-/_ only.', unique=True, max_length=75, verbose_name='username', validators=[django.core.validators.RegexValidator('^[\\w.@+-]+$', 'Enter a valid username.', 'invalid')]),
            preserve_default=True,
        ),
    ]

我的自定义更改是使用户名和电子邮件字段的长度相同(因为两者在我的系统中是相同的),以及更改默认验证器以将它们都验证为电子邮件地址。自 Django 1.3 以来,我一直在使用这些更改。据推测,现在它们只是一个问题,因为我不再使用 South 并且必须重新生成所有迁移。

看起来我什至无法使用MIGRATION_MODULES 将其生成到自定义迁移文件夹中,因为我还有一些其他应用程序依赖于 auth 的 0001_initial 迁移,例如:

class Migration(migrations.Migration):

    dependencies = [
        migrations.swappable_dependency(settings.AUTH_USER_MODEL),
    ]

所以如果我用MIGRATION_MODULES 覆盖它,比如:

MIGRATION_MODULES = {
    'auth': 'myoverrides.auth_migrations',
}

迁移实际上消失了,引发了错误。

【问题讨论】:

  • 您不应该对 Django 本身的应用程序进行更改。您能否举例说明您所做的更改以及由此产生的迁移?
  • @Aniket 你是在建议我成为一名 Django 核心开发人员并让他们的所有应用程序都不受管理?!
  • @DanielRoseman,我已经更新了详细信息。我正在自定义用户名字段的长度和其他一些小的更改,因为这些更改是几年前应用于我的数据库的,因此不需要迁移这些更改。
  • “我正在自定义用户名字段的长度和其他一些小改动”这就是 custom user models 的用途。
  • @Chris,不是这样。我没有改变模型。我改变了模型......几年前。重写数百行代码只是为了升级到 Django 1.7 的新迁移和自定义用户模型不是我想做的事情。我想要的只是让 Django 迁移自动模型,因为它不再改变。根据该文档页面,使用自定义用户模型需要大量重构。

标签: python django


【解决方案1】:

这有点小技巧,但我修改了我的 settings.py 以检查 sys.argv 是否有“makemigrations”,并从我的 INSTALLED_APPS 列表中删除实际上不受管理的冲突应用程序。这使我能够正确生成自定义 auth 迁移。例如

if 'makemigrations' in sys.argv
    INSTALLED_APPS.remove('conflicting_third_party_app')

【讨论】:

    猜你喜欢
    • 2014-12-29
    • 2015-10-09
    • 2015-04-08
    • 2014-08-21
    • 1970-01-01
    • 2014-12-13
    • 2016-04-14
    • 2014-05-28
    • 1970-01-01
    相关资源
    最近更新 更多