gpt4 book ai didi

python - 在 Django 中模拟瑞士锦标赛

转载 作者:太空宇宙 更新时间:2023-11-03 13:54:09 31 4
gpt4 key购买 nike

我正在尝试创建代表 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

但这感觉有点老套,尤其是关于 player2 有时是 None 的部分。另外,我认为它不能很好地促进搜索(因为我们正在寻找的玩家可能在 player1 或 player2 插槽中)。

有没有更好的方法?我怀疑我的 django 新手阻碍了我在这里找到正确的解决方案。

最佳答案

您可以重构您的 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()

关于python - 在 Django 中模拟瑞士锦标赛,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/846485/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com