Flask SQLAlchemy多对多关联表插入Order数据报错问题咨询
错误根源
Order模型的meals是SQLAlchemy定义的多对多关系属性,该属性仅接受Meals模型的实例集合,不支持直接传入餐品主键的整数值。直接赋值meals=1会导致ORM无法完成类型映射,触发运行时报错。
修复实现逻辑
- 先通过餐品主键查询出对应的
Meals持久化实例,可按需增加判空校验避免无效关联:
target_meal = Meals.query.get(1) if not target_meal: raise ValueError("指定id的餐品不存在")
- 实例化
Order时,将包含该实例的可迭代对象赋值给meals属性:
order_to_database = Order( data='05_03_2021', meals=[target_meal] ) db.session.add(order_to_database) db.session.commit()
补充说明
- 多对多关系属性为类列表的集合类型,即使仅关联1个餐品,也需要用列表等可迭代格式封装传入的实例,不能直接传单个实例或裸主键
- 若需关联多个餐品,只需在列表中追加对应
Meals实例即可,例如meals=[meal1, meal2, meal3] - 若要为订单新增全新的餐品记录,可直接实例化
Meals对象后加入meals列表,提交时SQLAlchemy会自动处理关联表的插入逻辑
内容的提问来源于stack exchange,提问作者Владимир Кузовкин
相关产品推荐
相关产品推荐

