Django建模:在同一个对象中使用两次相同的数据

时间:2012-09-19 18:04:51

标签: django database-design django-models

我正在尝试为朋友之间的每周足球比赛写一个django应用程序。

我计划建立一个名为Player的模型,一个名为Game and for Game的模型拥有(并且属于)许多玩家,这样人们就可以为游戏注册。

但是在本周的某个时刻,我想将一些球员分配到一个球队,一些球员分配到另一个球队 - 但直到每个人都有机会注册。

我可以看到我可以通过让游戏拥有两个团队并且每个团队拥有许多玩家来实现这一点,但这意味着我正在使用每个玩家在游戏模型中不止一次进入团队。这对我来说不太合适。

我显然也希望将可以进入每个队的玩家的选择限制为已注册游戏的玩家。

是否有另一种建模方法,以便我不会在同一个Game对象中使用两次相同的数据?

1 个答案:

答案 0 :(得分:1)

因为您需要跟踪注册并将球员分配到球队 我没有看到任何其他方式。实际上刮了那个。

中间(GamePlayerMembership)实例的存在可以表示是否 玩家已注册或未注册游戏。所以我的看法是:

from django.db import models

class Player(models.Model):
    name = models.CharField()

class Game(models.Model):
    starts_when = models.DatetimeField()
    players = models.ManyToManyField(Player, through='GamePlayerMembership', related_name='games_played')

    def register(self, player):
        return GamePlayerMembership.objects.create(game=self, player=player)

    def assign(self, player, team):
        try:
            memb = GamePlayerMembership.objects.get(game=self, player=player)
            memb.team = team
            memb.save()
        except GamePlayerMembership.DoesNotExist:
            raise Exception('Player has not registered for the game')

class GamePlayerMembership(models.Model):
    TEAMS = (
        ('home', 'Home'),
        ('guest', 'Guest')
    )
    game = models.ForeignKey(Game)
    player = models.ForeignKey(Player)
    team = models.CharField(max_length=5, choices=TEAMS, null=True, blank=True)

    class Meta:
        unique_together = ('game', 'player')