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

Python Flask SQLAlchemy实现两张关联表数据合并为五列表格展示

解决方案

分两种实现方式,推荐使用第一种关联查询方案,稳定性更高:

方案1:利用ORM关联关系实现(推荐)

你已经在volunteer2122模型中定义了指向voluntary2122的event关联属性,不需要分开查询两个数据集,直接通过关联属性即可取到对应活动的全部字段。

步骤1:修改路由代码

student = student2122.query.filter_by(id=id).first()
# 只需查询志愿者参与记录即可,关联的活动数据可通过event属性直接读取
done_activities = volunteer2122.query.filter_by(student_id=student.id).all()
# 将done_activities传递到模板即可
return render_template('你的模板文件名.html', done_activities=done_activities)

步骤2:修改模板表格代码

<tbody class="my-2">
{% for s in done_activities %}
<tr>
    <td>{{ s.event.v_activity }}</td>
    <td>{{ s.event.v_date }}</td>
    <td>{{ s.event.v_time }}</td>
    <td>{{ s.event.v_duration }}</td>
    <td>{{ s.actual_hr }}</td>
</tr>
{% endfor %}
</tbody>

这种方式基于外键关联取值,完全不会出现数据错位的问题,符合ORM的使用规范。


方案2:列表配对合并实现

如果不想调整现有查询逻辑,也可以在路由层将两个一一对应的列表合并后传递到模板:

步骤1:修改路由代码

student = student2122.query.filter_by(id=id).first()
done_activities = volunteer2122.query.filter_by(student_id=student.id).all()
# 注意原events查询需要补充.all()获取结果列表
events = db.session.query(voluntary2122).join(volunteer2122, voluntary2122.id==volunteer2122.events_id).filter(volunteer2122.student_id==student.id).all()
# 合并两个列表为元组列表,按顺序一一对应
merged_data = list(zip(events, done_activities))
# 传递合并后的数据集到模板
return render_template('你的模板文件名.html', merged_data=merged_data)

步骤2:修改模板表格代码

<tbody class="my-2">
{% for k, s in merged_data %}
<tr>
    <td>{{ k.v_activity }}</td>
    <td>{{ k.v_date }}</td>
    <td>{{ k.v_time }}</td>
    <td>{{ k.v_duration }}</td>
    <td>{{ s.actual_hr }}</td>
</tr>
{% endfor %}
</tbody>

注意:该方案依赖两个列表的查询排序规则完全一致,如果后续调整了查询排序逻辑可能出现数据错位,不建议长期使用。


内容的提问来源于stack exchange,提问作者wing yan chan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 08:24:02