Допустим, у меня есть такой класс:
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
Спасибо!