Django ForeignKey:是否可以要求输入名称而不是ID?

时间:2014-08-25 10:31:48

标签: python django dictionary django-models django-views

我的问题是关于django模型和外键。我搜索了一个类似的问题,但似乎我找不到它。

我的模型如下:

class Matches(models.Model):
    day = models.ForeignKey('Day')
    team_home = models.ForeignKey('Team', related_name="home_set")
    team_away = models.ForeignKey('Team', related_name="away_set")
    golH = models.IntegerField(null=True)
    golA = models.IntegerField(null=True)

class Team(models.Model):
    league = models.ForeignKey('League')
    manager = models.ForeignKey(User)
    name = models.CharField(max_length=20)

现在,当我打电话时,有没有办法获取团队名称而不是id:

Matches.objects.filter(day=1).values()

作为替代方案: 有没有办法在Matches类中添加两个属性,如: class Matches(models.Model): ...

def team_home_name(self)
    return self.team_home.name

def team_home_away(self)
    return self.team_away.name

在我打电话时把它们放进字典里:

Matches.objects.filter(day=1).values()

注意: 我想将团队ID作为外键。 我需要在字典中拥有团队名称,因为我想传递给模板的是团队名称而不是团队ID。 我知道我可以在视图中使用想要的信息构建一个新的字典,将字典传递给模板,但是如果有一种方法可以在模型级别使用一些django技巧,那就更好了。

谢谢。

3 个答案:

答案 0 :(得分:2)

正如bruno所提到的,您可以将对象直接传递给模板。但是,使用values()也可以选择确定字典值的含义。例如:

Matches.objects.filter(day=1).values('team_home__name','team_away__name')

答案 1 :(得分:1)

  

"我需要在字典中拥有团队名称,因为我想要的是   传递给模板的是团队名称,而不是团队ID"

为什么要将dicts传递给模板? Django模板只适用于任何Python对象,包括模型和查询集 - 实际上这是最常见的模式。

答案 2 :(得分:0)

如果您所有这一切的目标只是为了能够从模板中访问团队名称,那么您不必在模型或视图中编写任何其他代码来实现这一目标。

当您在视图中查询Matches.objects.filter(day=1)并将其作为matches包含在模板的上下文中时,您应该能够访问模板中的团队名称,如下所示:

{% for match in matches %}
   Home team is {{match.team_home.name}} and away team is {{match.team_away.name}} <br>
{% endfor %}