Python 在Django为瑞士锦标赛建模
我正在尝试创建一个模型来表示一个具有多轮的模型。每一轮每个人都将与另一名球员配对,除非有一名奇数球员出局,这时一名球员将得到一个拜拜 我需要跟踪每个配对的结果;i、 e.哪个选手赢了。另外,我希望以后能够高效地搜索所有曾经与某个特定玩家交手过的玩家 显而易见的是:Python 在Django为瑞士锦标赛建模,python,django,django-models,Python,Django,Django Models,我正在尝试创建一个模型来表示一个具有多轮的模型。每一轮每个人都将与另一名球员配对,除非有一名奇数球员出局,这时一名球员将得到一个拜拜 我需要跟踪每个配对的结果;i、 e.哪个选手赢了。另外,我希望以后能够高效地搜索所有曾经与某个特定玩家交手过的玩家 显而易见的是: class Tournament(models.Model): name = models.CharField(max_length=80) class Player(models.Model): name = mo
class Tournament(models.Model):
name = models.CharField(max_length=80)
class Player(models.Model):
name = models.CharField(max_length=80)
起初,我计划举办一个类似于这样的“锦标赛配对”课程:
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
但这让人感觉有点不舒服,尤其是有时关于player2没有的部分。另外,我认为它不利于搜索(因为我们正在寻找的玩家可能在player1或player2位置)
有更好的办法吗?我怀疑我的django noob性格阻碍了我在这里找到正确的解决方案。我认为你应该有一个单人名单,而不是将其分为player1和player2,这两个可以在回合开始时构建 你的玩家类可以包括一个他们已经玩过的玩家列表,该列表上的最后一个玩家将是他们面对的当前玩家。当你选择下一个必须有人玩的玩家时,将该玩家添加到列表中
class Player(Models.model):
name = models.CharField(max_length=80)
playersPlayed = []
在每一轮中,对于单个玩家,只需遍历全局玩家列表,并将特定玩家与PlayerPlayed中的每个元素进行比较。如果元素不存在,则可以扮演该玩家,然后将该玩家添加到列表中。如果在某一轮中找不到某个玩家,则该玩家将被给予“再见”
我希望这至少是一个起点 您可以重构TournamentPairing类,使其更加以“轮”为中心,以帮助进行查询 选择=( ('n','Normal'), (‘b’、‘再见’), ) 在打成平局的情况下,让胜利者现场指向名为“平局”的球员 然后,根据您的搜索条件,查看给定玩家与之对抗的玩家列表:
# 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()
您想同时实现配对算法吗?如果您列出配对的搜索/操作,我们会有更好的想法。
# 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()