8

假设我有两个 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')

我想将 Entry 模型放在条目应用程序中:

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

如何解决 from ... import ... 语句,以便它们工作?当我输入导入语句时,例如from entries.models import Entry我从这些应用程序中获取模型时被 syncdb 忽略(因为导入是循环的),或者当我删除其中一个或两个时,我得到验证错误:

错误:一个或多个模型没有验证:entry.entry:'division'与模型 Division 有关系,它要么没有安装,要么是抽象的。Competitions.division: 'participants' 通过模型Entry指定m2m关系,尚未安装

我理解为什么会发生这种情况,但我不知道如何改变它,以便它工作(没有诉诸将 Entry 模型移动到比赛应用程序中,我真的不想这样做)。

4

2 回答 2

16

似乎我找到了答案,它的工作更一致:)

ForeignKey 类的Django 文档说:

要引用另一个应用程序中定义的模型,您可以显式指定具有完整应用程序标签的模型。例如,如果上面的制造商模型是在另一个名为 production 的应用程序中定义的,您需要使用:

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

在解决两个应用程序之间的循环导入依赖关系时,这种引用可能很有用。

于 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 回答