我有这些模型:
class League(models.Model):
...
class Game(models.Model):
league = models.ForeignKey(League, related_name='games')
...
class Competitor(models.Model):
user = models.ForeignKey(User, related_name='competitors')
game = models.ForeignKey(Game, related_name='competitors')
points = models.CharField(max_length=50, blank=True)
...
我想在我的模板中制作一个联盟得分表:
| Game1 | Game2 | Game3 | Tot
Comp1 | | | 8 | 8
Comp2 | 5 | | 1 | 6
Comp3 | | 4 | 3 | 7
但我无法弄清楚如何在视图中进行这些查询。我知道我可以参加联盟的比赛:
l = get_object_or_404(League, pk=id)
g = l.games
将它放在表头中,如下所示:
{% for game in g %}
<th>{{ game.name}}</th>
{% endfor %}
但是如何获得游戏联盟的明显竞争者名单?即使他们只在联赛中打了一场比赛。
如何在游戏中迭代竞争对手以获得积分? 我应该在这里研究哪些方法?或者它是一种更好的结构方式吗?
答案 0 :(得分:1)
我认为你应该能够做game.competitors_set.all()
并获得给定游戏对象的竞争对手。也许这不完全是你想要的。如果你想获得一个联盟对象并获得一个返回联盟中所有竞争对手的查询集,我想你想要的是:
league = League.objects.get(pk=<the league you want>)
competitors = Competitors.objects.filter(game__league=league)
〜EDIT〜
要进行迭代,您需要在某种类型的dict中以一种对迭代有意义的格式收集视图中的数据,然后将其传递给模板。我注意到的一件事是:你将“游戏”作为竞争对手模型的单一实例。这意味着每个竞争者只在一场比赛中。我想你想把它变成ManyToManyField。有关详细信息,请参阅here。