SQLAlchemy 2.0:如何按父类属性查询对应子类对象列表?
解决方案:通过父类属性查询关联的子表对象列表
针对你的需求,这里提供两种优雅的SQLAlchemy 2.0查询方案:
方案一:直接查询子表并关联过滤
直接从FoodItemModel出发,通过JOIN关联父表,根据父类属性过滤,这是性能最优的方式:
from sqlalchemy import select # 构建查询语句 stmt = select(FoodItemModel).join(FoodCategoryModel).where(FoodCategoryModel.name == 'Fruits') # 执行查询获取子对象列表 food_items = db.session.scalars(stmt).all()
方案二:先获取父类对象,再通过关系属性获取子对象
利用模型定义的foodItems动态关系,先定位到目标父类,再调用关系的查询方法:
# 方式1:通过name查询父类 category = db.session.query(FoodCategoryModel).filter_by(name='Fruits').first() # 方式2:如果知道父类ID,用get更高效 # category = db.session.get(FoodCategoryModel, 1) # 从父类对象获取关联的子对象列表 food_items = category.foodItems.all()
为什么之前的查询返回布尔值?
你之前的语句select(FoodCategoryModel.foodItems),SQLAlchemy会将其解析为检查关联关系是否存在的查询,而非直接查询子表对象,因此返回的是一组布尔值,而非预期的FoodItemModel实例。
内容的提问来源于stack exchange,提问作者FahdS
相关产品推荐
相关产品推荐

