为了学习网页开发,我正在开发一个网络应用程序来帮助我管理当地的网球双打联赛。我们每周播放一次,它的工作原理如下:
根据他们的排名,球员每周被分配到球场。每个球场上的四名球员打三局,改变每个球场的合作伙伴。一支球队赢了6场比赛赢得了一场比赛:
在我们结束之后,我会评估分数并重新计算每个球员的新排名。
以下是我的Django模型:
class Event(models.Model):
event_date = models.DateField()
class Player(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
class Set(models.Model):
event = models.ForeignKey(Event, on_delete=models.CASCADE)
team1_player1 = models.ForeignKey(
Player,
related_name='+',
on_delete=models.CASCADE)
team1_player2 = models.ForeignKey(
Player,
related_name='+',
on_delete=models.CASCADE)
team2_player1 = models.ForeignKey(
Player,
related_name='+',
on_delete=models.CASCADE)
team2_player2 = models.ForeignKey(
Player,
related_name='+',
on_delete=models.CASCADE)
team1_games_won = models.PositiveIntegerField(default=0)
team2_games_won = models.PositiveIntegerField(default=0)
至少,我有几个问题:
>>> p = Player.objects.get(id=1) >>> p.sets.all()
但是如果没有反向访问器,那就不那么简单了。
我可以让它发挥作用,但我想知道是否有比我的Set模式更好的方法?
由于
答案 0 :(得分:0)
我会考虑制作一个团队对象,为他们的玩家提供多对多的关系。这意味着你现在有6支队伍(例如红黄绿蓝靛紫)也可能对组织有所帮助。将每一组标记为team_x_player_x是很难记住的。
我就是这样做的。
事件:
日期 - 日期字段
sets - manytomanyfield#当天播放的所有剧集
集:
小组:
播放器:
现在你有一个明确定义的层次结构,其中一个事件有集合,集合有团队,团队有玩家。它摆脱了你对related_name的烦人问题。您现在可以拨打player.team.all()
并设置玩家所玩的所有球队。您还可以team.set.all()
获取每个团队所玩的所有集合。