按精确的ID列表过滤,而不是“in_”ID列表

时间:2015-05-06 13:59:23

标签: python sqlalchemy

ItemCondition具有一对多的关系。我需要查询完全这个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

1 个答案:

答案 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,这可能不是最有效的,但它可能就足够了。