我在使用SQLAlchemy和Flask正确向我的API正确显示数据时遇到麻烦。由于SQLAlchemy延迟加载关系而与查询结果无关,因此输出中的数据比ORM查询中的数据更多。
我汇总了一个查询,该查询选择Classification
个对象中的Asset
个对象,这些对象通过子查询的Assets
/ members / children上的关系进行内部联接Classification
。
我已经检查了我的ORM查询生成的SQL,它是正确的并产生了所需的结果。但是,当我运行代码并检查API输出时,SQLAlchemy选择正确的Classification
对象,然后为它们提供所有Assets
而不是我精心构建的原始查询中的过滤对象。
如前所述,这似乎是由于延迟加载造成的,不同的加载策略似乎只改变了关系的加载方式,而不改变了加载的内容,关闭延迟加载导致根本不加载。
>有没有一种方法可以只用查询中的数据填充ORM对象,而不用让它离开并填充所有关系而已?
# Inside Classification class
assets = db.relationship(
'Asset',
back_populates='classifications',
secondary='class_object'
)
# Inside our repository package
query = (
db.session.query(models.Classification)
)
assets_sub_query = (
db.session.query(models.Asset)
.join(models.Organisation, models.User.organisation)
.join(models.Project, models.Organisation.projects)
.join(models.Asset, models.Project.assets)
.filter(models.User.id == user_id)
)
query = query.join(assets_sub_query.subquery(), models.Classification.assets)
理想的结果是返回Classification
并仅与我们要加入的子查询中的Assets
一起显示。
SQLAlchemy实际上是基于原始关系映射填充assets
的,因此它包含了所有内容。
必须有一种方法,我看过非主要的映射器,但是在这种情况下看不到如何将资产映射到查询而不是静态表。