无法从外键打印名称而不是ID

时间:2014-10-29 23:26:21

标签: django

我有一个模型击球,它在特定球员中有统计数据。玩家信息在Master中,与Batting中的外键相关。

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)

我有两个问题:

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]

第一个列出了2013年的20个本垒打击球手。第二个是.values()和.annotate()来产生每个玩家的Homeruns总和并列出​​它们。第一个在我的模板中正常工作:

<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

如何让第二个查询从Master表而不是键中返回 unicode 值?

2 个答案:

答案 0 :(得分: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>

答案 1 :(得分:0)

我找到了解决方案:

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

3个值参数标识表中的唯一人。 category_name是一个字段。我很幸运,在这种情况下,所有三个值都是唯一的,我想显示名称,即使玩家(这是一个外键)足以识别分组