2009-02-24 59 views
4

我在我的Django項目兩種型號:在Django中,你不能在ManyToManyField上使用字符串連接嗎? ManyToMany不只是一個列表嗎?

  • 比賽
  • 球員

比賽有一個多對多酒店在玩家的指點下,讓多個玩家可以在比賽中競爭。我想通過加入玩家的全名,在Django管理員中返回一個信息豐富的對象名稱,例如「Richard Henry vs John Doe」。但是,以下失敗:

class Match(models.Model): 
    players = models.ManyToManyField(Player, verbose_name='Competitors') 

    def __unicode__(self): 
     return " vs ".join(self.players) 

ManyToManyFields不只是列出?爲什麼我不能加入他們?任何輸入讚賞。這是我的球員模型,incase幫助:

class Player(models.Model): 
    full_name = models.CharField(max_length=30) 

    def __unicode__(self): 
     return "%s" % self.full_name 

謝謝!

編輯:我剛剛發現,我可以使用self.players.list_display這個返回列表。我不再吐出一個回溯,但由於某種原因,__unicode__名稱現在返回None。任何想法爲什麼會這樣?

編輯2:更改代碼:

class Match(models.Model): 
    players = models.ManyToManyField(Player, verbose_name='Competitors') 

    def __unicode__(self): 
     return " vs ".join(self.players.list_display) 
+0

美國洛特:剛剛發佈了 '編輯2'。 – rmh 2009-02-25 10:44:51

回答

6

「?是否ManyToManyFields不只是列出」

他們querysets。這是列表式的,但不是實際列出的。

這樣做。

return " vs ".join(list(self.players)) 

列表函數將強制評估查詢集並返回列表對象。

0

不,ManyToManyField不是一個列表,它只是一個單一的鍵,並且匹配中的每個球員都會有一個Match實例。

您不希望在__unicode __()方法中執行查詢,因爲它最有可能是性能較高的命中。只需在您的模板中顯示X與Y即可。

11

另一種選擇是:

return " vs ".join(p.full_name for p in self.players.all()) 

注:對不起,將這一回 - 掘墓人:-)

相關問題