Web应用管理员端无法显示用户测验分数列表问题排查
问题分析与解决方案
你的问题核心在于数据库模型关联错误,导致查询无法获取用户与分数的对应数据,最终页面只显示表头。以下是具体问题和修复步骤:
1. 数据库模型设计缺陷
当前的分数表(Fundamentals_of_Networking_score等)没有与User表建立正确的关联关系:
- 每个分数表仅用自身主键
id与用户表的id关联,逻辑完全错误——用户表的id是用户主键,分数表的id是自身记录的主键,两者没有对应关系。 - 分数表缺少
user_id外键,无法标记该分数属于哪个用户。
修正后的模型代码
class User(db.Model, UserMixin): id = db.Column(db.Integer, primary_key=True) email = db.Column(db.String(150), unique=True) password = db.Column(db.String(150)) first_name = db.Column(db.String(150)) class Course(db.Model): id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(100), nullable=False) class Fundamentals_of_Networking_score(db.Model): id = db.Column(db.Integer, primary_key=True) scores = db.Column(db.Integer) # 添加外键关联用户表 user_id = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=False) # 建立反向关联,方便从用户对象获取分数 user = db.relationship('User', backref=db.backref('network_fundamentals_scores', lazy=True)) class Network_Tools_and_Testing_Devices_score(db.Model): id = db.Column(db.Integer, primary_key=True) scores = db.Column(db.Integer) user_id = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=False) user = db.relationship('User', backref=db.backref('network_tools_scores', lazy=True)) class Network_Cables_score(db.Model): id = db.Column(db.Integer, primary_key=True) scores = db.Column(db.Integer) user_id = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=False) user = db.relationship('User', backref=db.backref('network_cables_scores', lazy=True))
2. 查询语句错误
原查询使用内连接(join),要求用户必须在三个分数表中都有对应记录才会被返回;同时关联条件用错了字段(用了分数表的id而非user_id)。
修正后的查询代码
改用左外连接(outerjoin),确保即使用户缺少某科分数也能被查询到(对应分数显示None,可根据需求处理为0):
@views.route("/showall", methods=["GET"]) def show_all(): # 查询所有用户及其分数,左外连接保留所有用户 users_with_scores = db.session.query(User.first_name, User.email, Fundamentals_of_Networking_score.scores, Network_Tools_and_Testing_Devices_score.scores, Network_Cables_score.scores) \ .outerjoin(Fundamentals_of_Networking_score, User.id == Fundamentals_of_Networking_score.user_id) \ .outerjoin(Network_Tools_and_Testing_Devices_score, User.id == Network_Tools_and_Testing_Devices_score.user_id) \ .outerjoin(Network_Cables_score, User.id == Network_Cables_score.user_id) \ .all() scores_list = [] for user_data in users_with_scores: scores_list.append({ 'first_name': user_data[0], 'email': user_data[1], 'Fundamentals_of_Networking_score': user_data[2] or 0, # 把None转为0,可选 'Network_Tools_and_Testing_Devices_score': user_data[3] or 0, 'Network_Cables_score': user_data[4] or 0 }) print(scores_list) # 检查输出是否有数据 return render_template("showall.html", scores_list=scores_list, user=None)
3. 后续操作
- 执行数据库迁移:如果使用
Flask-Migrate,运行flask db migrate生成迁移文件,再执行flask db upgrade更新数据库结构。 - 确认数据:检查数据库中是否存在用户记录,以及对应分数表中是否有该用户的
user_id关联记录。
内容的提问来源于stack exchange,提问作者Ae gis
相关产品推荐
相关产品推荐

