SqlAlchemy: Проверка, находится ли один объект в каком-либо отношении (or_(object.relationship1.contains(otherObject), object.relationship2.contains(otherObject))

Допустим, у меня есть такой класс:

class Foo(declarativeBase):
     bars1 = relationship(Bar.Bar, secondary=foos_to_bars1, collection_class=set())
     bars2 = relationship(Bar.Bar, secondary=foos_to_bars2, collection_class=list())

(Каждое из отношений дает мне "Bar" с определенными условиями). В определенный момент я хочу получить экземпляры "Foo", которые имеют "Bar" (экземпляр Bar.Bar) в любом из отношений.

Если я пытаюсь сделать:

def inAnyBar(bar)
   query(Foo).filter(or_(Foo.bars1.contains(bar), Foo.bars2.contains(bar)).all()

я получаю пустой результат.

Похоже (для меня), что я делаю что-то вроде:

query(Foo).join(Foo.bars1).filter(Foo.bars1.contains(bar)).\
join(Foo.bars2).filter(Foo.bars1.contains(bar))

Поскольку Foo.bars1 не содержит bar, второй фильтр дает пустой результат.

Я смог найти обходной путь с подзапросами (каждый join+фильтр в подзапросе, затем or_ все подзапросы), но я хотел бы знать, есть ли лучший способ сделать это...

Я нашел вот это: http://techspot.zzzeek.org/2008/09/09/selecting-booleans/

Это делает то, что я хочу сделать, но это для SqlAlchemy 0.5, и я (почти) уверен, что есть "более чистый" способ сделать это в SqlAlchemy 0.6.6

Спасибо!

6
задан BorrajaX 25 May 2011 в 02:04
поделиться