Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django Migrations ValueError:[…]是用对[…]的惰性引用声明的_Python_Django_Django Migrations - Fatal编程技术网

Python Django Migrations ValueError:[…]是用对[…]的惰性引用声明的

Python Django Migrations ValueError:[…]是用对[…]的惰性引用声明的,python,django,django-migrations,Python,Django,Django Migrations,我有一个相当复杂的项目架构,它涉及几个模型包含交叉引用的应用程序 例如,我有一个billing.Premium模型-属于billing应用程序-它被另一个名为payments.PaymentJob的模型通过一对一字段引用: ('premium', models.OneToOneField(on_delete=django.db.models.deletion.PROTECT, to='billing.Premium', verbose_name='premium')) (此代码来自支付的迁移之

我有一个相当复杂的项目架构,它涉及几个模型包含交叉引用的应用程序

例如,我有一个
billing.Premium
模型-属于
billing
应用程序-它被另一个名为
payments.PaymentJob
的模型通过一对一字段引用

('premium', models.OneToOneField(on_delete=django.db.models.deletion.PROTECT, to='billing.Premium', verbose_name='premium'))
(此代码来自
支付
的迁移之一)

但是,当我需要将
billing.Premium
重命名为
billing.premiumInstallation
时,我遇到了一个有趣的问题:在重构代码以替换模型名称后,我尝试
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
时应用

有什么想法吗?

根据
RenameModel
操作的

如果您一次更改模型的名称和相当多的字段,您可能必须手动添加此项;对于autodetector,这看起来就像您删除了一个具有旧名称的模型,并添加了一个具有不同名称的新模型,它创建的迁移将丢失旧表中的所有数据

您应该手动创建迁移,并向其中添加
RenameModel
操作

class Migration(migrations.Migration):

    dependencies = [
        ('billing', 'xxxx_previous_migration'), 
    ]

    operations = [
        migrations.RenameModel('Premium', 'PremiumInstallment')
    ]

我是否必须编辑其他迁移以指向
billing.premiuminstallation
而不是
billing.Premium
?因为现在迁移有点麻烦,因为它指向的是一个不再存在的模型。我认为最好检查所有依赖于你重命名的模型的模型一个有趣的点——确保你的手动迁移在创建和保存你的自定义迁移文件后考虑了你所有的模型更改,运行
python manage.py makemigrations
。这将使迁移包含自定义迁移未考虑的所有更改。我对Django建模没有太多经验,但从错误中可以清楚地看出,您已经重命名了另一个模型引用的模型,然后更改了的模型不会迁移,因为再也找不到引用了。看看这一点,因为从你的错误可以解决作出正确的步骤不是简单的架构我做了,但所有的模型都在同一个应用程序,而我有两个模型在两个不同的应用程序,我无法管理重构通过所描述的方法正确。。。