Flask及SQLAlchemy查询当前登录用户专属数据库信息的实现方法
实现方案
方法1:直接添加过滤条件(改动最小)
首先确认两张预约表的模型已经定义了关联User表cust_id的外键字段,参考模型定义如下:
# 模型定义示例(未添加外键请先补充) class SpaReservation(db.Model): id = db.Column(db.Integer, primary_key=True) cust_id = db.Column(db.Integer, db.ForeignKey('user.cust_id'), nullable=False) spa_start = db.Column(db.DateTime, nullable=False) # 其余自定义字段省略 class HotelReservation(db.Model): id = db.Column(db.Integer, primary_key=True) cust_id = db.Column(db.Integer, db.ForeignKey('user.cust_id'), nullable=False) check_in = db.Column(db.DateTime, nullable=False) # 其余自定义字段省略
修改views.py中的查询逻辑,增加外键匹配过滤即可:
@views.route('/view-reservations', methods=['GET', 'POST']) @login_required def view_reservations(): # 仅筛选外键等于当前登录用户cust_id的记录 spa_query = SpaReservation.query.filter_by(cust_id=current_user.cust_id).all() hotel_query = HotelReservation.query.filter_by(cust_id=current_user.cust_id).all() return render_template('view-reservations.html', user=current_user.username, spa_query=spa_query, hotel_query=hotel_query)
模板代码不需要做任何修改,原有循环逻辑可以直接复用。
方法2:通过模型关系查询(符合SQLAlchemy最佳实践)
可以在User模型中预先定义和预约表的一对多关系映射,后续调用更简洁:
class User(db.Model): cust_id = db.Column(db.Integer, primary_key=True) username = db.Column(db.String(50), unique=True, nullable=False) # 其余用户自定义字段省略 # 定义和两张预约表的关联关系 spa_reservations = db.relationship('SpaReservation', backref='booker', lazy=True) hotel_reservations = db.relationship('HotelReservation', backref='booker', lazy=True)
修改后views.py可以直接通过current_user的关系属性拿到对应数据,无需手动写过滤条件:
@views.route('/view-reservations', methods=['GET', 'POST']) @login_required def view_reservations(): return render_template('view-reservations.html', user=current_user.username, spa_query=current_user.spa_reservations, hotel_query=current_user.hotel_reservations)
内容的提问来源于stack exchange,提问作者Kapernski
相关产品推荐
相关产品推荐

