迁移期间的 Django 问题 - 懒惰的参考

Posted

技术标签:

【中文标题】迁移期间的 Django 问题 - 懒惰的参考【英文标题】:Django issue during migrations - lazy reference 【发布时间】:2017-07-24 11:29:16 【问题描述】:

我目前将此模型添加到我的应用中

from mainApp.models import modelPatient

class modelBodyParts(models.Model):
    part_name             = models.CharField(max_length=1000, unique=False , default="")
    modelPatient          = models.ForeignKey(modelPatient)
    result                = models.CharField(max_length=3000, unique=False , default="")

现在 makemigrations 和 migrate 命令给我以下错误

 >>python manage.py makemigrations 
 >>python ./manage.py migrate

ValueError: The field interviewApp.modelInterviewAnswers.patients was declared with a lazy reference to 'mainApp.modelpatients', but app 'mainApp' doesn't provide model 'modelpatients'

我不确定这意味着什么。但我确实记得在某一时刻mainApp.modelpatients 存在,然后它被更改为mainApp.modelpatient 仍然存在。我该如何解决这个问题,为什么会出现?任何帮助将不胜感激。

【问题讨论】:

问题解决了吗? 【参考方案1】:

对我来说,发生了这个错误,因为我正在从

交换一个 ForeignKey 模型
my_field = models.ForeignKey('old.model', ...)

my_field = models.ForeignKey('new.model', ...)

解决方案是手动编辑生成的迁移,并将来自 new 应用的最新迁移添加为依赖项:

class Migration(migrations.Migration):
    dependencies = [
        ('old', '0016_whatever'),
        ('new', '0002_latest_migration'),   # Add this line
    ]

【讨论】:

我在尝试撤消跨应用添加的ForeignKey 时遇到了@JamesFranco 的相同错误,您的解决方案有所帮助。 Django 的自动迁移并没有在dependencies 中列出第二个应用程序,所以我不得不手动添加它【参考方案2】:

尝试使用RenameModelRenameField。在这里查看答案:https://***.com/a/26241640/57952

【讨论】:

【参考方案3】:

我刚刚在最新的 django 上再次遇到了这个问题。共享模型已重命名(但移至新应用),问题是它未能选择一个引用它的其他应用。

我不明白为什么只有一个应用有问题,而其他应用却没有。最初的 makemigraitons 很好,所以只需将它添加到它创建的迁移文件中。之后,对makemigrations 的后续调用返回“未检测到更改”,应该是这样。

# Generated by Django 3.2.5
from django.db import migrations

class Migration(migrations.Migration):
    dependencies = [
        # all the following apps were correctly added as dependencies
        ('supplier',  '0001_initial'),
        ('marketing', '0004_add_some_field'),
        ('devops',    '0002_fix_some_model'),
        ('sales',     '0001_initial'),
        ('warehouse', '0010_set_trained'),
        ('products',  '0005_change_sku_format'),
        ('search',    '0003_remove_bad_data'),

        # Manually add this one, for the app that was missed
        ('left_out',  '0007_change_name'),
    ]

    operations = [
        migrations.RenameModel(
            old_name='OldModelName',
            new_name='NewModelName',
        ),
    ]

【讨论】:

【参考方案4】:

只需删除以前的迁移文件,一旦对模型进行了新的更改以相互继承,最好删除旧的迁移,然后执行新的“makemigrations”

【讨论】:

好的,让我们试试核选项

以上是关于迁移期间的 Django 问题 - 懒惰的参考的主要内容,如果未能解决你的问题,请参考以下文章

在测试期间更改 Django 迁移应用程序的顺序

Django 在迁移期间要求默认值

如何在南迁移期间调用 django 模型类的静态方法

迁移回滚期间无法从其他应用导入 Django 模型

Django 模型外键字段在测试期间的迁移中不可用

在 Django 迁移期间收到“ValueError: Found wrong number of (0) of constraint for ...”