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阻碍了我在这里寻找合适的解决方案.
您可以将您的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)
| 归档时间: |
|
| 查看次数: |
1588 次 |
| 最近记录: |