Django中计算外键关联得分总和并展示到表格列的实现问题
问题原因
你的原实现错误是将聚合查询逻辑直接放在了tables.Column的参数中:django-tables2的列定义仅负责声明要展示的字段、渲染规则、表头名称等展示层逻辑,不处理数据聚合,聚合需要提前在传入表格的查询集上完成。
修改步骤
1. 调整PlayerTable定义
仅声明要展示的聚合字段即可,对应你后续注解生成的字段名:
class PlayerTable(tables.Table): # verbose_name为表格中该列的表头名 total_score = tables.Column(verbose_name="总得分") class Meta: model = Player exclude = ["id"] attrs = {'class': 'table table-sm'}
2. 视图层传入带聚合注解的查询集
在你实例化PlayerTable的视图代码中,先给Player查询集添加总得分聚合注解,再传入表格实例:
from django.db.models import Sum # 给每个玩家对象添加total_score聚合字段,统计关联所有Game的score总和 player_queryset = Player.objects.annotate( total_score = Sum('game__score') # 可选:按总得分倒序排列 ).order_by('-total_score') # 实例化表格时传入处理好的查询集 player_table = PlayerTable(player_queryset)
补充:队伍总得分表格实现
同理你需要的队伍总得分表格实现如下:
# 队伍表格定义 class TeamTable(tables.Table): total_score = tables.Column(verbose_name="总得分") class Meta: model = Team exclude = ["id"] attrs = {'class': 'table table-sm'}
视图层传参:
from django.db.models import Sum team_queryset = Team.objects.annotate( total_score = Sum('game__score') ).order_by('-total_score') team_table = TeamTable(team_queryset)
可选优化
如果希望没有比赛记录的玩家/队伍总得分显示0而非null,可以用Coalesce处理空值:
from django.db.models import Sum, Value from django.db.models.functions import Coalesce player_queryset = Player.objects.annotate( total_score = Coalesce(Sum('game__score'), Value(0.0)) )
内容的提问来源于stack exchange,提问作者Bash----
相关产品推荐
相关产品推荐

