ValueError:相关模型u' app.model'无法解决

时间:2015-11-03 10:08:39

标签: django django-models django-migrations

我有两个应用程序(ookeek说)我希望从ook中的模型eek中使用外键到模型。两者都在INSTALLED_APPSook首先。

ook.models.py中,我有:

class Fubar(models.Model):
    ...

eek.models.py中,我有:

class monkey(models.Model):
    external = models.ForeignKey('ook.Fubar', blank=True, null=True)
    ...

生成的迁移是:

class Migration(migrations.Migration):

    dependencies = [
        ('eek', '0002_auto_20151029_1040'),
    ]

    operations = [
        migrations.AlterField(
            model_name='monkey',
            name='external',
            field=models.ForeignKey(blank=True, to='ook.Fubar', null=True),
        ),
    ]

当我运行迁移时,我收到此错误:

   ...
   1595             raise ValueError('Foreign Object from and to fields must be
the same non-zero length')
   1596         if isinstance(self.rel.to, six.string_types):
-> 1597             raise ValueError('Related model %r cannot be resolved' % self.rel.to)
   1598         related_fields = []
   1599         for index in range(len(self.from_fields)):
ValueError: Related model u'ook.Fubar' cannot be resolved

我做错了什么?

6 个答案:

答案 0 :(得分:51)

由于您在操作中ForeignKey,因此您必须向ook添加dependencies

dependencies = [
    ('ook', '__first__'),
    ('eek', '0002_auto_20151029_1040'),
]

Django迁移有两个"魔法"值:

  • __first__ - 获取模块首次迁移
  • __latest__ - 获取模块最新迁移

答案 1 :(得分:5)

我遇到了同样的错误,但是引用了一个被声明为同一迁移的一部分的模型。事实证明,第一个migrations.CreateModel(...)引用了尚未声明的模型。我手动将其移到了被引用模型的声明之下,然后一切正常。

答案 2 :(得分:1)

尝试为每个模型一个接一个地运行迁移。

这样,您可以调试遇到问题的app

python manage.py migrate appmname

答案 3 :(得分:1)

在我的情况下,导致此错误的是缓存和先前的迁移。我删除了__pycache__和migrations文件夹,然后重新运行migrations命令,它起作用了。

请记住,当您执行python manage.py makemigrations时,将不会看到任何新的迁移,并将控制台输出no changes detected。您必须要做python manage.py makemigrations your_app_name才能使工作正常。

答案 4 :(得分:0)

我发现当你向下滚动到底部时,看起来这个bug还没有修复。

Django ValueError: Related model cannot be resolved Bug

我使用的是1.11.7,他们正在谈论1.9.3。

它在localhost上运行了一切,但是在Heroku上总是失败,所以我测试了上面的所有选项/答案,没有任何效果。

然后我注意到,Admin的localhost数据库我创建了1个配置文件(1个DB记录),去了Heroku,DB有0个Profile表记录,所以我添加了1个,推送了迁移,python manage.py迁移和一切都好。

这验证了我不需要手动更改任何这些全部正在运行的迁移。

也许这对某人有帮助。

迁移

# -*- coding: utf-8 -*-
# Generated by Django 1.11.7 on 2017-11-23 21:26
from __future__ import unicode_literals

from django.db import migrations, models
import django.db.models.deletion


class Migration(migrations.Migration):

    dependencies = [
         ('blog', '0005_blog_author'),
    ]

    operations = [
        migrations.AlterField(
             model_name='blog',
             name='author',

field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, 
to='core.Profile'),
        ),
    ]

答案 5 :(得分:0)

当尝试将基本模型的子模型用作外键时遇到此错误。这是有道理的,因为子模型上没有id字段,因此无法正常工作。我的解决方法是在密钥上使用父级。不幸的是,这不是立即直观的,使我退缩了几个小时。