SQLAlchemy:筛选多对多joinload

问题描述 投票:0回答:1

我具有用于“单词”和“短语”之间多对多关联的当前表设置:

association_table_wp = Table('words_phras', Base.metadata,
                             autoload=True,
                             extend_existing=True)

class Phrase(Base):
    __tablename__ = 'phrases'
    __table_args__ = {'autoload': True}

    def __init__(self, phrase, explanation=None, active=False):
        self.phrase = phrase
        self.explanation = explanation
        self.active = active

class Word(Base):
    __tablename__ = 'words'
    __table_args__ = {'autoload': True}

    def __init__(self, word, word_id=None, active=False):
        self.word = word
        self.word_id = word_id
        self.active = active

Word.phrases = relationship(Phrase,
                            secondary=association_table_wp,
                            backref="words")

现在通常当我想查询一些单词及其短语时,我使用:

words = db_session.query(Word).filter(Word.id.in_(word_ids)).\
             options(joinedload(Word.phrases)).\
             all()

这使我可以访问words[i].phrases以访问与给定单词相关的短语。

现在,这可以正常工作,但是请注意该“活动”属性。我想过滤单词的短语,以便仅返回带有active == True的单词。如何才能做到这一点?我已经尝试了联接和eager_loading的几种组合,但没有一个能如我所愿。

非常感谢。

python filter sqlalchemy many-to-many
1个回答
3
投票

我认为您正在寻找contains_eager()

contains_eager()
© www.soinside.com 2019 - 2024. All rights reserved.