【问题标题】:ValueError: Related model u'app.model' cannot be resolvedValueError: 无法解析相关模型 u'app.model'
【发布时间】:2016-02-03 10:35:06
【问题描述】:

我有两个应用程序(ook 和 eek 说),我想从 eek 中的模型使用外键到 ook 中的模型。两者都在INSTALLED_APPS 中,ook 首先。

在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

我做错了什么?

【问题讨论】:

  • ook 和 eek 是否包含在 INSTALLED_APPS 中的 settings.py 中?
  • @Leistungsabfall:是的,他们是,ook 在 eek 之前。
  • 'ook.models.Foobar' 也许?
  • @cdvv7788:因为我在ook 上将Fubar 添加到顶部__init__.py,所以没有任何区别。

标签: django django-models django-migrations


【解决方案1】:

因为你有ForeignKey在操作,你必须在dependencies中添加一个ook:

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

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

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

【讨论】:

  • “first”是什么意思?我有同样的问题,但它不适合我
  • first 表示找到最初创建该“模型”的应用程序,找到它..
  • 为什么没有自动生成?
  • @Sören 这可能是错误。 migrations.AlterField on ForeignKey 不要生成 dependencies(在 1.11.4 上测试)
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    当您向下滚动到底部时,我发现此错误似乎尚未修复。

    Django ValueError: Related model cannot be resolved Bug

    我使用的是 1.11.7,他们说的是 1.9.3。

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

    然后我注意到,Admin 中的 localhost DB 我创建了 1 个配置文件(1 个 DB 记录),转到 Heroku 并且 DB 有 0 个配置文件表记录,所以我添加了 1 个,推送迁移,python manage.py migrate 和一切顺利。

    这验证了我不需要手动更改任何迁移,一切正常。

    也许它会对某人有所帮助。

    迁移

    # -*- 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'),
            ),
        ]
    

    【讨论】:

      【解决方案4】:

      我在尝试使用基础模型的子模型作为外键时遇到了这个错误。它不起作用是有道理的,因为子模型上没有 id 字段。我的解决方法是在密钥上使用父级。不幸的是,这并没有立即直观,让我倒退了几个小时。

      【讨论】:

        【解决方案5】:

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

        这样你就可以调试你遇到问题的app

        python manage.py migrate appmname
        

        【讨论】:

          【解决方案6】:

          在我的例子中,是缓存和以前的迁移导致了这个错误。我删除了__pycache__ 和迁移文件夹,然后重新运行迁移命令并且它工作了。

          请记住,当您执行 python manage.py makemigrations 时,它不会看到任何新的迁移,而是控制台输出 no changes detected。您必须改为 python manage.py makemigrations your_app_name 才能使事情正常进行。

          【讨论】:

          • 这对我来说是最快的解决方案
          【解决方案7】:

          dependencies 的顺序太重要了。

          在您的情况下,必须先创建ook,然后再依赖eek。

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

          【讨论】:

            猜你喜欢
            • 2018-03-12
            • 2015-06-17
            • 2020-11-26
            • 2018-12-18
            • 2019-04-20
            • 2019-04-14
            • 2023-02-04
            • 2015-12-23
            • 2023-03-21
            相关资源
            最近更新 更多