在Django中塑造瑞士锦标赛

时间:2009-05-11 01:55:18

标签: python django django-models

我正在尝试创建代表swiss tournament的模型,包含多轮。每一轮每个人都将与另一个玩家配对,除非有一个奇怪的玩家出局,一个玩家将获得再见。

我需要跟踪每个配对的结果;即哪个玩家赢了。此外,我希望能够有效地搜索所有曾经与特定球员比赛过的球员。

显而易见的事情:

class Tournament(models.Model):
    name = models.CharField(max_length=80)

class Player(models.Model):
    name = models.CharField(max_length=80)

起初我打算参加“TournamentPairing”课程,看起来像这样:

class TournamentPairing(models.Model):
    tournament = models.ForeignKey(Tournament)
    round = models.IntegerKey()
    player1 = models.ForeignKey(Player)
    player2 = models.ForeignKey(Player, null = True) # In case of a bye, this is None.
    outcome = models.CharField(max_length=1) # player1 wins, loses, bye, or tie

但是这有点像hacky,特别是关于player2有时候没有的部分。此外,我认为它不便于搜索(因为我们正在寻找的播放器可能在播放器1或播放器2插槽中)。

有更好的方法吗?我怀疑我的django noob-ness阻止我在这里找到正确的解决方案。

2 个答案:

答案 0 :(得分:5)

您可以将您的TournamentPairing类重构为更“圆”,以帮助进行查询。

选择=(     ('n','正常'),     ('b','再见'),     )

class Round(models.Model):        
    number = models.IntegerField()
    round_type = models.CharField(max_length=1, default="n", choices=CHOICES)
    tournament = models.ForeignKey(Tournament)
    players = models.ManyToManyField(Player, related_name="rounds")
    winner = models.ForeignKey(Player, null=True, related_name="round_winner") 

在平局的情况下,将胜者场点指向称为“领带”的玩家。

然后,根据您的搜索条件,查看给定玩家所玩的玩家列表:

# grab a player 
p = Player.objects.get(name='Tom')

# see what rounds this player played in
rounds_played = p.rounds.all()

# who did this player play against?
[r.players for r in rounds_played]

# to see all rounds this player won
p.round_winner.all()

答案 1 :(得分:1)

我认为你应该只有一个玩家列表,而不是将它分成player1和player2,这些可以在设置回合时构建。

您的玩家类可以包含他们玩过的玩家列表,该列表中的最后一个玩家将是他们面对的当前玩家。当你选择下一个必须玩的玩家时,将该玩家添加到列表中。

class Player(Models.model):
  name = models.CharField(max_length=80)
  playersPlayed = []

在每轮比赛中,对于单个玩家,只需遍历全局玩家列表并将特定玩家与玩家玩家中的每个元素进行比较。如果元素不存在,则可以播放该人,然后应将该播放器添加到列表中。如果找不到特定回合的玩家,那么该玩家将获得再见。

我希望这至少是一个起点。