【发布时间】: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 不 迁移自动模型,因为它不再改变。根据该文档页面,使用自定义用户模型需要大量重构。