Скажем, у меня есть такой класс:
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())
(Каждое из отношений дает мне «Бар» с определенными условиями). В определенный момент я хочу получить экземпляры «Foo», у которых есть «бар» (экземпляр 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, второй фильтр дает пустые результаты.
Мне удалось найти обходной путь с подзапросами (каждое соединение + фильтр в подзапросе, затем or_ все подзапросы), но я хотел бы знать, есть ли лучший способ сделать это...
Я нашел это: http://techspot.zzzeek.org/2008/09/09/selecting-booleans/
Это делает то, что я хочу сделать, но это для SqlAlchemy 0.5, и я (почти) уверен, что есть «более чистый» способ сделать это с SqlAlchemy 0.6.6.
Благодарю вас!