Item
与Condition
具有一对多的关系。我需要查询完全这个Item
列表的所有Conditions
(没有子集,没有超集)。
以下查询显然不太好,因为找到Item.conditions
可能是item1.conditions
的一个子集:
condition_ids = [x.id for x in item1.conditions]
DBSession.query(Item).join(Condition, Item.conditions).filter(
Item.sku_id==item1.sku_id).filter(Condition.id.in_(condition_ids)).all()
是否有可能实现这种查询结果? (当然没有“手动”消除所有不适合这种情况的Item
)
答案 0 :(得分:1)
qry = DBSession.query(Item)
# ensure that each condition is present using separate condition
for cid in condition_ids:
qry = qry.filter(Item.conditions.any(Condition.id == cid))
# ensure that other skills are not present:
qry = qry.filter(~Item.conditions.any(~Condition.id.in_(condition_ids)))
如果你有很多condition_ids
,这可能不是最有效的,但它可能就足够了。