Django:在不同应用中定义ManyToManyField的“through”模型有办法吗?
假设我有两个Django应用:
- competitions - 这个应用用来处理比赛数据
- entries - 这个应用用来处理把选手报名参加比赛的功能
在competitions应用里,我有一个模型,代表比赛的一个部分:
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模型放在entries应用里:
class Entry(models.Model):
division = models.ForeignKey('Division')
competitor = models.ForeignKey(Competitor)
withdrawn = models.BooleanField(default=False)
我该如何解决从...导入...的语句,让它们能够正常工作呢?当我写类似from entries.models import Entry
的导入语句时,系统会因为循环导入的问题而忽略这些应用的模型,或者当我去掉其中一个或两个时,又会出现验证错误:
错误:一个或多个模型没有通过验证:entries.entry: 'division'与模型Division有关系,但这个模型要么没有安装,要么是抽象的。competitions.division: 'participants'通过模型Entry指定了一个多对多的关系,但这个模型没有被安装。
我明白为什么会出现这个问题,但我不知道该如何修改才能让它正常工作(我真的不想把Entry模型移动到competitions应用里)。
2 个回答
5
有时候,django.db.models.get_model
可以帮助解决循环导入的问题。在你的例子中,试着正常导入 Entry
,然后把 Entry
中的 division
外键定义改成这样:
from django.db.models import get_model
class Entry(models.Model):
division = models.ForeignKey(get_model('competitions', 'Division'))
16
看起来我找到了一个答案,这个方法更稳定一些 :)
如果你想引用在其他应用中定义的模型,可以明确地使用完整的应用标签来指定模型。例如,如果上面的Manufacturer模型是在另一个叫做production的应用中定义的,你就需要这样写:
class Car(models.Model):
manufacturer = models.ForeignKey('production.Manufacturer')
这种引用方式在解决两个应用之间的循环导入依赖时非常有用。