2015-11-03 102 views
15

我有两个应用程序(ookeek说),我想从eek中的模型中使用外键到ook中的模型。第一个是INSTALLED_APPS,第二个是ookValueError:相关模型u'app.model'无法解析

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 

我在做什么错?

+0

是'ook'和'eek'包含在''中settings.py' INSTALLED_APPS'? – Leistungsabfall

+0

@Leistungsabfall:是的,他们和'ook'在'eek'之前。 – Sardathrion

+0

'ook.models.Foobar'也许? – cdvv7788

回答

32

,因为你必须在操作ForeignKey,您必须添加一个ookdependencies

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

Django的迁移有两个 “神奇” 的价值观:

  • __first__ - 获取模块首先迁移
  • __latest__ - 获取模块最新迁移
+0

'__first__'是什么意思?我有同样的问题,但它不适合我 –

+1

@ Harun-Ur-Rashid看到我的编辑 –

+0

哦,很多很多谢谢@Tomasz。 __latest__适合我 –

4

我刚刚得到了同样的错误,但是指的是作为相同迁移的一部分声明的模型。原来,第一个migrations.CreateModel(...)提到了一个尚未宣布的模型。我手动将它移动到被引用模型的声明下面,然后一切正常。

0

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

Django ValueError: Related model cannot be resolved Bug

我使用1.11.7,他们谈论1.9.3。

它在localhost上工作,但在Heroku上总是失败,所以我测试了上面的所有选项/答案,没有任何工作。

然后我注意到,管理员中的localhost数据库有1个配置文件创建(1个数据库记录),去Heroku和DB有0个记录的配置文件表,所以我已经添加了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'), 
     ), 
    ]