You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Django中获取关联模型Queryset并在Template中展示全量数据

你当前的问题出在两个地方:

  1. 模板中使用了未定义的变量game_ref_assignment,自然无法获取到裁判分配数据
  2. 单个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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 22:21:01