如何在Django中获取关联模型Queryset并在Template中展示全量数据
你当前的问题出在两个地方:
- 模板中使用了未定义的变量
game_ref_assignment,自然无法获取到裁判分配数据 - 单个Game对应多条Referee_Assignments记录,你需要遍历每个Game关联的分配记录才能拿到对应数据
下面提供两种实现方案,根据你需要的展示形式选择即可:
方案1:单条赛事占一行,同赛事的所有裁判信息放在同一单元格
适合查看赛事列表为主的场景,先优化查询代码,避免后续遍历触发额外的数据库查询:
try: # prefetch_related预拉取关联的裁判分配数据,以及分配数据关联的用户、职位、状态字段 games = Game.objects.prefetch_related( 'ref_assignments', 'ref_assignments__user', 'ref_assignments__position', 'ref_assignments__status' ).all() context = {'games': games} return render(request, 'assign/index.html', context) except Exception as e: print('查询失败:', e)
修改模板代码,先修正重复的Location表头,再遍历每个赛事的分配记录:
{% extends 'base.html' %} {% load static %} {% block content %} <h1>Welcome to the Assignor Home Page</h1> <div class="container-games"> <div class="settings__table"> <table id="mydatable" class="display nowrap table table-striped" style="width:100%"> <thead> <tr> <th>日期/时间</th> <th>星期</th> <th>主队</th> <th>客队</th> <th>地点</th> <th>赛事等级</th> <th>性别组别</th> <th>裁判信息</th> <th>分配状态</th> </tr> </thead> <tbody> {% for game in games %} <tr> <td>{{ game.gdate|date:"Y-m-d H:i" }}</td> <td>{{ game.gdate|date:'l' }}</td> <td>{{ game.home }}</td> <td>{{ game.visitor }}</td> <td>{{ game.location }}</td> <td>{{ game.level }}</td> <td>{{ game.gender }}</td> <td> {% for assign in game.ref_assignments.all %} {{ assign.user.username }} | {{ assign.position }}<br> {% empty %} 暂未分配裁判 {% endfor %} </td> <td> {% for assign in game.ref_assignments.all %} {{ assign.status }}<br> {% empty %} - {% endfor %} </td> </tr> {% endfor %} </tbody> </table> </div> </div> {% endblock %}
方案2:单条分配记录占一行,赛事信息随每条分配记录重复展示
适合导出、统计分配明细的场景,直接查询Referee_Assignments表,用select_related关联所有外键字段,查询效率更高:
try: assignments = Referee_Assignments.objects.select_related( 'game', 'game__home', 'game__visitor', 'game__location', 'game__level', 'game__gender', 'user', 'position', 'status' ).all() context = {'assignments': assignments} return render(request, 'assign/index.html', context) except Exception as e: print('查询失败:', e)
对应模板修改为遍历分配记录:
{% extends 'base.html' %} {% load static %} {% block content %} <h1>Welcome to the Assignor Home Page</h1> <div class="container-games"> <div class="settings__table"> <table id="mydatable" class="display nowrap table table-striped" style="width:100%"> <thead> <tr> <th>日期/时间</th> <th>星期</th> <th>主队</th> <th>客队</th> <th>地点</th> <th>赛事等级</th> <th>性别组别</th> <th>裁判姓名</th> <th>裁判职位</th> <th>分配状态</th> </tr> </thead> <tbody> {% for assign in assignments %} <tr> <td>{{ assign.game.gdate|date:"Y-m-d H:i" }}</td> <td>{{ assign.game.gdate|date:'l' }}</td> <td>{{ assign.game.home }}</td> <td>{{ assign.game.visitor }}</td> <td>{{ assign.game.location }}</td> <td>{{ assign.game.level }}</td> <td>{{ assign.game.gender }}</td> <td>{{ assign.user.username }}</td> <td>{{ assign.position }}</td> <td>{{ assign.status }}</td> </tr> {% endfor %} </tbody> </table> </div> </div> {% endblock %}
内容的提问来源于stack exchange,提问作者Tim Wool
相关产品推荐
相关产品推荐

