如何在Flask SQLAlchemy中创建一对多数据库关系?
如何在Flask-SQLAlchemy中创建一对多关系
在你的场景里,一个用户可以拥有多个订单,这是典型的一对多关系,实现方式如下:
步骤1:修改模型类
给Order添加关联用户的外键,同时在User中添加反向关联属性:
class User(db.Model): id = db.Column(db.Integer, primary_key=True) username = db.Column(db.String, unique=True, nullable=False) email = db.Column(db.String) # 反向关联用户的所有订单,backref让Order实例能通过.user访问所属用户 orders = db.relationship('Order', backref='user', lazy=True) class Order(db.Model): id = db.Column(db.Integer, primary_key=True) ProductName = db.Column(db.String, nullable=False) price = db.Column(db.String) # 外键关联User的id,user.id对应User模型生成的表名(小写user)和主键字段 user_id = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=False)
关键部分说明
- 外键
user_id:确保每个订单都必须关联一个存在的用户,nullable=False强制订单必须属于某个用户;db.ForeignKey('user.id')中的user是User模型对应的数据库表名(SQLAlchemy默认将类名转为小写作为表名)。 relationship属性:User中的orders属性让你可以直接通过user.orders获取该用户的所有订单;backref='user'则让Order实例可以通过order.user直接拿到对应的用户对象,无需手动通过user_id查询。
使用示例
创建用户和关联订单
# 创建用户 new_user = User(username='john_doe', email='john@example.com') db.session.add(new_user) db.session.commit() # 创建属于该用户的订单 new_order = Order(ProductName='Phone', price='599', user=new_user) db.session.add(new_order) db.session.commit()
查询用户的所有订单
user = User.query.filter_by(username='john_doe').first() # 获取该用户的所有订单 user_orders = user.orders for order in user_orders: print(f"订单商品:{order.ProductName},价格:{order.price}")
查询订单所属的用户
order = Order.query.filter_by(ProductName='Phone').first() # 获取订单对应的用户 order_user = order.user print(f"订单所属用户:{order_user.username}")
内容的提问来源于stack exchange,提问作者Sharpshooter Gaming
相关产品推荐
相关产品推荐

