2012-09-19 116 views
0

我想爲我們的朋友之間的每週足球比賽編寫一個django應用程序。Django建模:在同一個對象中使用兩次相同的數據

我計劃建立一個名爲Player的模型,一個名爲Game的模型,並且爲了讓Game擁有(並屬於)許多玩家,所以人們可以爲遊戲註冊自己。

但是在本週的某個時候,我想分配一些球員到一個球隊,一些到另一個球員 - 但是直到每個人都有機會註冊。

我可以看到我可以通過讓一個遊戲擁有兩個團隊和每個團隊擁有許多玩家來實現這一點,但這意味着我在遊戲模型中多次使用每個玩家進入團隊。這不太適合我。

我當然也想限制玩家可以進入每個團隊的選擇,以註冊遊戲的玩家。

是否有另一種建模方式,以便在同一個遊戲對象中不使用相同的數據兩次?

回答

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') 
+0

好的,爲延遲迴復而道歉 - 我分心了。但是,上面的工作,謝謝。我在這裏和那裏添加了一些比特,比如說一個非註冊方法,但這正是我所需要的。再次感謝。 – bodger

+0

@bodger不用擔心,很高興我幫了忙。 – rantanplan

相關問題