Django网球联赛模型设计

时间:2016-12-29 23:26:49

标签: python django django-models

为了学习网页开发,我正在开发一个网络应用程序来帮助我管理当地的网球双打联赛。我们每周播放一次,它的工作原理如下:

根据他们的排名,球员每周被分配到球场。每个球场上的四名球员打三局,改变每个球场的合作伙伴。一支球队赢了6场比赛赢得了一场比赛:

  • 第1组:玩家1& 4 vs Players 2& 3
  • 第2组:玩家1& 3 vs Players 2& 4
  • 第3组:玩家1& 2 vs Players 3& 4

在我们结束之后,我会评估分数并重新计算每个球员的新排名。

以下是我的Django模型:

class Event(models.Model):
    event_date = models.DateField()

class Player(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)

class Set(models.Model):
    event = models.ForeignKey(Event, on_delete=models.CASCADE)
    team1_player1 = models.ForeignKey(
        Player,
        related_name='+',
        on_delete=models.CASCADE)
    team1_player2 = models.ForeignKey(
        Player,
        related_name='+',
        on_delete=models.CASCADE)
    team2_player1 = models.ForeignKey(
        Player,
        related_name='+',
        on_delete=models.CASCADE)
    team2_player2 = models.ForeignKey(
        Player,
        related_name='+',
        on_delete=models.CASCADE)
    team1_games_won = models.PositiveIntegerField(default=0)
    team2_games_won = models.PositiveIntegerField(default=0)

至少,我有几个问题:

  1. 在Set模型中,Player ForeignKey属性导致反向 存取冲突,所以我添加了related_name ='+'。
  2. 如果以后我决定检索玩家的Set历史,那么做这样的事情会很好:
  3. >>> p = Player.objects.get(id=1)
    >>> p.sets.all()
    

    但是如果没有反向访问器,那就不那么简单了。

    我可以让它发挥作用,但我想知道是否有比我的Set模式更好的方法?

    由于

1 个答案:

答案 0 :(得分:0)

我会考虑制作一个团队对象,为他们的玩家提供多对多的关系。这意味着你现在有6支队伍(例如红黄绿蓝靛紫)也可能对组织有所帮助。将每一组标记为team_x_player_x是很难记住的。

我就是这样做的。

事件:

  • 日期 - 日期字段

  • sets - manytomanyfield#当天播放的所有剧集

集:

  • 团队 - manytomanyfield
  • 获胜者 - foreignfield
  • 得分 - 文本字段(6-3)

小组:

  • name - textfield(简化前队红色和队伍蓝色)
  • 球员 - manytomanyfield

播放器:

  • user - foreignfield
  • mmr - 整数

现在你有一个明确定义的层次结构,其中一个事件有集合,集合有团队,团队有玩家。它摆脱了你对related_name的烦人问题。您现在可以拨打player.team.all()并设置玩家所玩的所有球队。您还可以team.set.all()获取每个团队所玩的所有集合。