建模两个在它们之间有约束的多对多关系

时间:2018-01-11 05:09:08

标签: django database-design django-models django-rest-framework

在我正在编写的应用程序中,我有3个模型:PlayerPlanCoach

它们是如此相关:

  • Player可以包含多个Plan个,但每个Plan都与Player相关 只有一个Plan
  • Coach可以包含多个Coach和一个Plan 可以有很多Coach个。 (例如Plan可能会合作为Player s提出Plan。)

这两种关系的建模本身看起来非常清楚:第一种是一对多关系,其中PlayerPlan的外键,第二种是CoachCoach之间的多对多关系。

但是,这些模型之间存在第三种较为柔和的关系:Player指导多个Player,而Coach可以有多个Coach s, Player的{​​{1}}集Player集将永远是Coach所有Plan ManyToMany的{​​{1}}集合through }秒。 这种关系我不确定如何最好地建模。

这与定义的Plan模型(Plans是直通模型)的Coaches关系感觉相似,但事实是throughForeignKey由于Django documentation似乎引用players模型必须对每个模型都有一个Coach,因此多对多会让人感到困惑。

我也在使用Django Rest Framework,并且在一天结束时我想要的结果是能够在每个返回的Player上包含属性ManyToMany。此属性是Coach ID的JSON数组。

为此,似乎可以在PlayerSerializer#create之间定义直接Serializer#update,然后覆盖Plan和{{1}对于Player,只需抓取并更新与创建或更新的Coach相关联的每个Plan上的players。然后,我可以将Serializer字段添加到Coach的{​​{1}}。然而,这确实看起来有点复杂和过于复杂,这使我怀疑有更聪明或更清洁的方法来做到这一点。 有没有人知道更标准的方法来实现这一目标?

以上是Django中定义的更全面的建模,以防上述描述不够明确:

class Player(models.Model):
    pass

class Plan(models.Model):
    player = models.ForeignKey(Player, related_name='plans') # Can now do Foo.bars
    coaching_team = models.ManyToManyField(Coach)

class Coach(models.Model):
    pass

以下是我提出的可能过于复杂的变化模型的样子:

class Player(models.Model):
    pass

class Plan(models.Model):
    player = models.ForeignKey(Player, related_name='plans') # Can now do Foo.bars
    coaching_team = models.ManyToManyField(Coach)

class Coach(models.Model):
    players = models.ManyToManyField(Player)

1 个答案:

答案 0 :(得分:1)

如果Coach's Players被定义为与她Plan相关联的那些,那么除了模型之外没有任何其他内容;你已经拥有了所需的信息。

坚持使用原始建模。要获得与ids相关联的所有Players的{​​{1}},您只需执行以下操作:

coach