2016-03-08 61 views
2

我正在一個django網站上工作,該網站可以顯示一些關於球員和比賽的信息。Django球員模型

會有多個匹配和多個玩家。我遇到的問題是,我不知道如果這是我應該做的事情:

class Player(models.Model): 
    player_id = models.IntegerField(default=0) 
    matches = models.ManyToMany(Match) 

class Matches(models.Model): 
    match_id = models.IntegerField(default=0) 
    players = models.ManyToMany(Player) 

或者我應該做的事情:

class Player(models.Model): 
    player_id = models.IntegerField(default=0) 

class Matches(models.Model): 
    match_id = models.IntegerField(default=0) 
    players = models.ManyToMany(Player) 

玩家可以在多個比賽中,一場比賽可以包含多名球員,這就是爲什麼我有點困惑。

回答

0

您應該只在其中一個模型中定義關係,所以第二個例子是正確的。

在第一個問題中(順便提一句,您應該是Matches),您在兩種模型之間創建了兩種單獨的M2M關係,您不希望在您的情況下擁有這兩種關係。

在一個不相關的音符,你需要有player_idmatch_id列,Django會自動爲您的模型建立id列。

+0

謝謝你的幫助!第一個和第二個有什麼區別?就像兩個單獨的M2M關係一樣,它們不僅僅是相互引用?對於'player_id'和'match_id',如果ID不是從0/1開始的,那很好嗎?對不起,我是一般的新手django:\ – Rohinder

+0

@Rohinder在第二種情況下,你創建了兩個單獨的關係,它們不是相互引用。例如,可以用來指示哪些球員在哪場比賽中進行比賽,而另一名球員可以用於指示哪些球員是替補球員進行比賽。 – Selcuk

+0

@Rohinder關於'id's,你通常不應該關心它們並且把管理留給Django,除非你有一個已經存在數據庫的數據庫。 – Selcuk

0

您definetelly必須使用ManyToManyField,你只能將其添加到一個模型:

class Player(models.Model): 
    player_id = models.IntegerField(default=0) 
    matches = models.ManyToMany(Match) 

class Matches(models.Model): 
    match_id = models.IntegerField(default=0) 

聲明車型後,播放器對象訪問他們的相關匹配對象在接下來的方式:

player.matches.all() 

比賽對象有權訪問其相關選手對象:

match.player_set.all() 

看到文章Many-to-many relationships, Django documentation,有很多使用Django ManyToMany關係如何撥號的完整信息。

+0

謝謝!我應該把M2M放在玩家還是比賽?它會有所作爲嗎? – Rohinder

+0

@Rohinder兩個模型都可以訪問對方,所以我沒關係。 –

+0

@Rohinder iv'e添加了如何從每個模型訪問相關對象的片段。 –

0

以下代碼將解決您的項目的模型結構。

class TimeStamped(models.Model): 
    created = models.DateTimeField(auto_now_add=True) 
    updated = models.DateTimeField(auto_now=True) 

    class Meta: 
     abstract = True 

class Player(TimeStamped): 
    name = models.CharField(max_length=50) 
    extra_info = models.TextField() 
    matches = models.ManyToManyField('Match') 

    def __unicode__(self): 
     return self.name 

class Match(TimeStamped): 
    title = models.CharField(max_length=50) 
    extra_info = models.TextField() 

    class Meta: 
     verbose_name_plural = 'Matches' 

    def __unicode__(self): 
     return self.title 

TimeStamped模型是您構建的每個項目的好主意。如果您使用Python 3,則用__str__替換__unicode__。不要在模型名稱中使用複數形式。使用verbose_name_plural,這是我認爲的慣例。看起來你可能會遇到來自Match實例的查詢玩家的問題。請閱讀文檔以獲取關於這方面的詳細信息。如果你在這裏找不到那篇文章。由於這篇文章不是關於查詢集的,所以我跳過了這部分。

0

絕對正確的這種情況下,ManyToMany關係是需要在數據庫中設置。

如果您未提供任何其他主鍵,則id是Django模型中的默認字段。而且ID是增量式的。根據我的觀點,以下模型足以滿足您的方案。

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

class Match(modles.Model): 
    player = models.ManyToMany(Player, related_name="matches") 

根據上述模型示例,您可以訪問一個玩家和玩單場比賽的玩家的比賽。

match = Match.objects.get(id=1) 
print match.player.all() # It will print all players for match of id 1 

player = Player.objects.get(id=1) 
print player.matches