2014-10-29 67 views
0

我有一個模型在特定的球員有統計數據的擊球。玩家信息在Master中,與Batting中的外鍵相關。不能從外鍵打印名稱而不是ID

class Batting(models.Model): 
    player = models.ForeignKey(Master) 
    year = models.IntegerField() 
    homeruns = models.IntegerField() 
    ... 

    def __unicode__(self): 
     #return "%s %s %s" % (self.player.name_first, self.player.name_last, self.team) 
     return "%s %s" % (self.player.name_first, self.player.name_last) 


class Master(models.Model): 
    id = models.CharField(max_length=30, primary_key=True) 
    name_first = models.CharField(max_length=30) 
    name_last = models.CharField(max_length=30, db_index=True) 
    ... 

    def __unicode__(self): 
     return "%s %s" % (self.name_first, self.name_last) 

我有兩個疑問:在2013年

home_runs = Batting.objects.filter(year=max_year['year__max']).order_by('-homeruns')[:20] 
home_runs_all_time = Batting.objects.values('player').annotate(hrs=Sum('homeruns')).order_by('-hrs')[:20] 

第一個列出的前20名本壘打擊球手的第二個涉及.values()和.annotate()所產生本壘打的總和每個球員並列出他們。第一次在我的模板正常工作:

<h2>Most Home Runs in a Season -- {{ year }}</h2> 
<table> 
    <tr> 
    <th>Name</th> 
    <th>Homeruns</th> 
    </tr> 
    {% for p in home_runs %} 
    <tr> 
    <td>{{ p }}</td><td>{{p.homeruns}}</td> 
    </tr> 
    {% endfor %} 
</table> 

<h2>Most Home Runs All Time</h2> 
<table> 
    <tr> 
    <th>Name</th> 
    <th>Homeruns</th> 
    </tr> 
    {% for p in home_runs_all_time %} 
    <tr> 
    <td>{{ p.player }}</td><td>{{p.hrs}}</td> 
    </tr> 
    {% endfor %} 
</table> 

但在第二打印HTML中的FK ID而不是名稱: 大多數家庭在季節運行 - 2013

Name Homeruns 
Chris Davis 53 
Miguel Cabrera 44 
Pedro Alvarez 36 
Edwin Encarnacion 36 

多數本壘打所有時間

Name Homeruns 
bondsba01 762 
aaronha01 755 

如何讓第二個查詢返回從主表,而不是關鍵的的Unicode價值?

回答

0

我找到了一個解決方案:

Batting.objects.values('player', 'player__name_first', 'player__name_last').annotate(category=Sum(category_name)).order_by('-category')[:20] 

3個值參數確定在一個獨特的人表。 category_name是一個字段。在這種情況下,我很幸運,所有三個值都是獨一無二的,即使播放器(這是一個外鍵)足以識別分組,我也想顯示這些名稱。

2

我想你應該嘗試這樣的:

home_runs_all_time = Batting.objects.values('player__name_first', 'player__name_last').annotate(hrs=Sum('homeruns')).order_by('-hrs')[:20] 
模板

<h2>Most Home Runs All Time</h2> 
<table> 
    <tr> 
    <th>Name</th> 
    <th>Homeruns</th> 
    </tr> 
    {% for p in home_runs_all_time %} 
    <tr> 
    <td>{{ p.player__name_first }} {{ p.player__name_last }}</td><td>{{p.hrs}}</td> 
    </tr> 
    {% endfor %} 
</table> 
+0

謝謝,但那並不奏效。我認爲它與.values()方法有關,因爲如果沒有這種方法,頂級主頁在特定的一年運行良好。 (查看兩個查詢) – 2014-10-30 16:17:29

+0

上面應該可以工作。在我的機器上測試了類似的東西。確保你以同樣的方式複製它 – 2014-10-30 17:06:47

相關問題