Django Migrations ValueError: [...] 是用对 [...] 的惰性引用声明的
Posted
技术标签:
【中文标题】Django Migrations ValueError: [...] 是用对 [...] 的惰性引用声明的【英文标题】:Django Migrations ValueError: [...] was declared with a lazy reference to [...] 【发布时间】:2018-04-04 00:06:13 【问题描述】:我有一个相当复杂的项目架构,其中涉及多个模型包含交叉引用的应用程序。
例如,我有一个 billing.Premium
模型 - 属于 billing
应用程序 - 它被另一个名为 payments.PaymentJob
的模型通过一对一字段引用:
('premium', models.OneToOneField(on_delete=django.db.models.deletion.PROTECT, to='billing.Premium', verbose_name='premium'))
(此代码来自payment
的迁移之一)
但是当我需要将billing.Premium
重命名为billing.PremiumInstallment
时,我遇到了一些问题,这就是有趣的部分:在重构我的代码以替换模型名称之后,我尝试将django-admin makemigrations
,它导致以下错误:
ValueError: The field payments.PaymentJob.premium was declared with a lazy reference to 'billing.premium', but app 'billing' doesn't provide model 'premium'.
自从我重命名外部应用程序的模型后,我的迁移似乎已中断。我不知道如何以一种奇特的方式解决这个问题,我的意思是生成一些没有错误的迁移,并且当我运行 django-admin migrate
时会应用它。
有什么想法吗?
【问题讨论】:
我对 Django 建模不是很有经验,但是从错误中可以清楚地看出,您是否已经重命名了另一个引用的模型,然后由于找不到引用,所以不会迁移更改。看看这个,因为你的错误可以解决在不简单的架构上采取正确的步骤***.com/questions/25091130/… 我做了,但是所有模型都在同一个应用程序中,因为我在两个独立的应用程序中有两个模型,我无法通过所描述的方法正确重构...... 【参考方案1】:根据docs进行RenameModel
操作
如果您一次更改模型的名称和很多字段,您可能必须手动添加它;对于自动检测器,这看起来就像您删除了一个旧名称的模型并添加了一个不同名称的新模型,它创建的迁移将丢失旧表中的所有数据。
您应该手动创建迁移并将RenameModel
操作添加到其中
class Migration(migrations.Migration):
dependencies = [
('billing', 'xxxx_previous_migration'),
]
operations = [
migrations.RenameModel('Premium', 'PremiumInstallment')
]
【讨论】:
我是否必须编辑另一个迁移以指向billing.PremiumInstallment
而不是billing.Premium
?因为现在迁移有点麻烦,因为它指向一个不再存在的模型。
我相信你最好检查所有依赖于你重命名的模型
有趣的一点——为了确保您的手动迁移考虑到所有模型更改,在创建并保存您的自定义迁移文件后,运行python manage.py makemigrations
。这将使用您的自定义迁移未考虑的所有更改进行迁移。适合簿记和复核。以上是关于Django Migrations ValueError: [...] 是用对 [...] 的惰性引用声明的的主要内容,如果未能解决你的问题,请参考以下文章
解决“django.db.utils.ProgrammingError: 关系 django_migrations 的权限被拒绝”的步骤