我卡住了。我遇到的问题是我想创建一个objects.all()
列表,但是其中一个ForeignKey
相同的所有对象应该合并到一个列表中的一个条目。
我的模特:
class TournamentStandings(models.Model):
tournament = models.ForeignKey(Tournament, on_delete=models.CASCADE)
player = models.ForeignKey(Player, on_delete=models.CASCADE)
player_place = models.FloatField(verbose_name=u"Place")
我想得到的清单是这样的:
ID |播放器|比赛|地点 1 | Name_1 | Tournament_1,Tournament_2 | Place_on_tournament_1,P_o_t_2 2 | Name_2 | Tournament_1,Tournament_2 | Place_on_tournament_1,P_o_t_2
因此ForeignKey(Player)
将是我想要限制和组合条目的那个。我尝试了objects.all()的通用视图和模板中的循环:
{% for player in ranking_list %}
<tr>
<td>{{ ranking_list.id }}</td>
<td>{{ ranking_list.player }}</td>
<td>{{ ranking_list.tournament }}</td>
<td> {{ ranking_list.player_place }} </td>
</tr>
{% endfor %}
它不起作用。任何提示??
答案 0 :(得分:1)
在您的查询中添加order_by
,以便同一玩家的排名是连续的,并将结果传递到itertools.groupby
以获取“子列表”(同一玩家的所有排名组合在一起)。然后,您可以以任何您喜欢的方式处理/格式化。
答案 1 :(得分:0)
我使用了一点点不同的方法。 我在views.py中使用了注释:
ranking_list = TournamentStandings.objects.values('player__name').annotate(Sum('player_points'))
return render(request, 'rankings.html', {'ranking_list': ranking_list})
然后在我的模板中,我会显示包含player__name
和player_points_sum
的列。排序由模板中的webstack_django_sorting
完成,因此用户可以通过列来决定他们想要显示结果的顺序。
template.html:
{% load sorting_tags %}
<table class="table table-bordered">
<thead>
<tr>
<th>{% anchor player__name _("Gracz") %}</th>
<th>{% anchor player_points__sum _("Punkty") %}</th>
</tr>
</thead>
{% load static %}
<tbody>
{% autosort ranking_list %}
{% for ranking_list in ranking_list %}
<tr>
<td>{{ ranking_list.player__name }}</td>
<td> {{ ranking_list.player_points__sum }} </td>
</tr>
{% endfor %}
</tbody>
</table>