8

2 つの django アプリがあるとします。

  • 競技- 競技データを処理します
  • エントリ- 競合他社のコンテストへの参加に関連する機能を処理します

大会アプリには、大会のセクションを表すモデルがあります。

class Division(models.Model):
    competition = models.ForeignKey(Competition)
    discipline = models.CharField(max_length=1, choices=DISCIPLINE_CHOICES)
    age_group = models.ForeignKey(AgeGroup)
    participants = models.ManyToManyField(Competitor, through='Entry')

エントリーモデルをエントリーアプリに入れたい:

class Entry(models.Model):
    division = models.ForeignKey('Division')
    competitor = models.ForeignKey(Competitor)
    withdrawn = models.BooleanField(default=False)

from ... import ... ステートメントが機能するようにするにはどうすればよいですか? I get the models from these apps ignored by syncdb (インポートが循環しているため)などのインポート ステートメントをfrom entries.models import Entry挿入したり、それらの 1 つまたは両方を削除したりすると、検証エラーが発生します。

エラー: 1 つ以上のモデルが検証されませんでした: entry.entry: 'division' はモデル Division と関係がありますが、インストールされていないか抽象的です。Competitions.division: 'participants' は、インストールされていないモデル Entry を介して m2m 関係を指定します

なぜこれが起こるのか理解していますが、これを変更して機能させる方法がわかりません(エントリーモデルを競技アプリに移動する必要はありませんが、これは本当にやりたくないことです)。

4

2 に答える 2

16

より一貫して機能する答えを見つけたようです:)

ForeignKey クラスに関するDjango のドキュメントには、次のように書かれています。

別のアプリケーションで定義されたモデルを参照するには、完全なアプリケーション ラベルを使用してモデルを明示的に指定できます。たとえば、上記の Manufacturer モデルが production という別のアプリケーションで定義されている場合は、次を使用する必要があります。

class Car(models.Model):
    manufacturer = models.ForeignKey('production.Manufacturer')

この種の参照は、2 つのアプリケーション間の循環インポートの依存関係を解決するときに役立ちます。

于 2010-01-04T15:04:46.520 に答える
5

場合によってdjango.db.models.get_modelは、循環インポートを回避するのに役立ちます。あなたの例では、Entry通常どおりインポートして、divisionFK 定義を次のように変更してみてくださいEntry

from django.db.models import get_model

class Entry(models.Model):
    division = models.ForeignKey(get_model('competitions', 'Division'))
于 2009-12-28T17:01:47.500 に答える