按确切的 ID 列表而不是 "in_" ID 列表过滤
Filtering by exact list of IDs instead of "in_" list of IDs
Item
与Condition
是一对多的关系。我需要查询所有 完全 这个 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()
是否可以实现这样的查询结果? (没有 "manual" 消除所有 Item
之后当然不符合这个条件)
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
,这可能不是最有效的,但它可能已经足够了。
Item
与Condition
是一对多的关系。我需要查询所有 完全 这个 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()
是否可以实现这样的查询结果? (没有 "manual" 消除所有 Item
之后当然不符合这个条件)
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
,这可能不是最有效的,但它可能已经足够了。