我有一个非常复杂的项目架构,涉及多个应用程序,其模型包含交叉引用。
例如,我有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
时,我已经到了某种程度,这就是有趣的部分来了:在重构我的代码以替换模型名称之后,我尝试{ {1}},会导致以下错误:
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'.
时应用。
有什么想法吗?
答案 0 :(得分:0)
根据RenameModel
操作的docs
如果您同时更改模型的名称及其中的一些字段,则可能必须手动添加此项;对于自动检测器,这看起来像是删除了一个具有旧名称的模型并添加了一个具有不同名称的模型,并且它创建的迁移将丢失旧表中的任何数据。
您应手动创建迁移并向其添加RenameModel
操作
class Migration(migrations.Migration):
dependencies = [
('billing', 'xxxx_previous_migration'),
]
operations = [
migrations.RenameModel('Premium', 'PremiumInstallment')
]