Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在Django为瑞士锦标赛建模_Python_Django_Django Models - Fatal编程技术网

Python 在Django为瑞士锦标赛建模

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

我正在尝试创建一个模型来表示一个具有多轮的模型。每一轮每个人都将与另一名球员配对,除非有一名奇数球员出局,这时一名球员将得到一个拜拜

我需要跟踪每个配对的结果;i、 e.哪个选手赢了。另外,我希望以后能够高效地搜索所有曾经与某个特定玩家交手过的玩家

显而易见的是:

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()