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

Mon*_*lik 8 python django django-models manytomanyfield django-apps

可以说我有两个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')
Run Code Online (Sandbox Code Playgroud)

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

class Entry(models.Model):
    division = models.ForeignKey('Division')
    competitor = models.ForeignKey(Competitor)
    withdrawn = models.BooleanField(default=False)
Run Code Online (Sandbox Code Playgroud)

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

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

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

Mon*_*lik 16

好像我找到了一个答案,它更加一致:)

ForeignKey类Django文档说:

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

class Car(models.Model):
    manufacturer = models.ForeignKey('production.Manufacturer')
Run Code Online (Sandbox Code Playgroud)

在解析两个应用程序之间的循环导入依赖关系时,此类引用非常有用.


Ben*_*end 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'))
Run Code Online (Sandbox Code Playgroud)