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
相关产品推荐
相关产品推荐

