2015-05-06 86 views
0

ItemCondition具有一對多關係。我需要查詢所有Item,其中正好是這個列表Conditions(沒有子集,沒有超集)。通過ID的確切列表而不是「in_」列表進行過濾

下面的查詢顯然不是很好,因爲發現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
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,但也可能是足夠剛剛好。