web-dev-qa-db-ja.com

ValueError:関連モデルu'app.model 'を解決できません

2つのアプリケーション(ookeek say)があり、ookのモデルからeekのモデルに外部キーを使用したい。両方とも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

私は何を間違えていますか?

31
Sardathrion

操作にForeignKeyがあるため、ookdependenciesに追加する必要があります。

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

Djangoの移行には、2つの「マジック」値があります。

  • __first__-モジュールの最初の移行を取得
  • __latest__-モジュールの最新の移行を取得
58

同じエラーが発生しましたが、同じ移行の一部として宣言されたモデルを参照しています。最初のmigrations.CreateModel(...)はまだ宣言されていないモデルを参照していることが判明しました。これを参照モデルの宣言の下に手動で移動すると、すべて正常に機能しました。

5
decibyte

モデルごとに移行を1つずつ実行してみてください。

このようにして、問題に直面しているappをデバッグできます

python manage.py migrate appmname
4

基本モデルの子モデルを外部キーとして使用しようとしたときに、このエラーが発生しました。子モデルにidフィールドがないため、機能しなかったのは理にかなっています。私の修正は、キーで親を使用することでした。残念ながら、これはすぐに直観的ではなく、数時間かかりました。

0
Braden Holt

下にスクロールすると、このバグはまだ修正されていないようです。

Django ValueError:関連モデルを解決できないバグ

私は1.11.7を使用しています、彼らは1.9.3について話している。

ローカルホストではすべて動作しましたが、Herokuでは常に失敗していたため、上記のすべてのオプション/回答をテストしましたが、何も動作しませんでした。

次に、管理者のローカルホストDBに1つのプロファイル(1つのDBレコード)が作成され、Herokuに移動し、DBにプロファイルテーブルのレコードがないため、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'),
        ),
    ]
0
Radek