在Django中塑造瑞士锦标赛

csb*_*oks 3 python django django-models

我正在尝试创建代表瑞士锦标赛的模型,有多轮.每一轮每个人都将与另一个玩家配对,除非有一个奇怪的玩家出局,一个玩家将获得再见.

我需要跟踪每个配对的结果; 即哪个玩家赢了.此外,我希望以后能够有效地搜索所有曾经与特定玩家对战的玩家.

显而易见的事情:

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

class Player(models.Model):
    name = models.CharField(max_length=80)
Run Code Online (Sandbox Code Playgroud)

起初我打算参加"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
Run Code Online (Sandbox Code Playgroud)

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

有没有更好的办法?我怀疑我的django noob-ness阻碍了我在这里寻找合适的解决方案.

Har*_*old 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") 
Run Code Online (Sandbox Code Playgroud)

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

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

# 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()
Run Code Online (Sandbox Code Playgroud)