Django:有没有办法在与包含ManyToManyField的模型不同的应用程序中的ManyToManyField中使用“直通”模型?

时间:2009-12-28 16:50:16

标签: python django django-models django-apps manytomanyfield

假设我有两个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模型放入条目app:

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忽略了这些应用程序中的模型(因为导入是循环的),或者当我删除其中一个或两个时,我得到验证错误:

  

错误:一个或多个模型没有   validate:entries.entry:'division'   与模特师有关系,   没有安装或   是抽象的。 competitions.division:   '参与者'指定m2m   通过模型Entry的关系   尚未安装

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

2 个答案:

答案 0 :(得分:16)

似乎我找到了一个更有效的答案:)

Django documentation on the ForeignKey class说:

  

引用另一个中定义的模型   应用程序,你可以明确   指定一个完整的模型   申请标签。例如,如果   上面的制造商型号定义于   另一个叫做生产的应用   你需要使用:

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

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

答案 1 :(得分:5)

有时,django.db.models.get_model有助于解决循环导入问题。在您的示例中,尝试正常导入Entry并将division中的Entry FK定义更改为:

from django.db.models import get_model

class Entry(models.Model):
    division = models.ForeignKey(get_model('competitions', 'Division'))