【问题标题】:SQLAlchemy: filter many-to-many joinedloadSQLAlchemy:过滤多对多joinedload
【发布时间】:2013-08-18 14:28:24
【问题描述】:

我为“单词”和“短语”之间的多对多关联设置了当前表格:

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 的短语。如何才能做到这一点?我尝试了多种 join 和 eager_loading 的组合,但都没有达到我希望的效果。

非常感谢。

【问题讨论】:

    标签: python filter sqlalchemy many-to-many


    【解决方案1】:

    我认为contains_eager() 是您正在寻找的:

    words = db_session.query(Word).\
        join(Word.phrases).\
        options(contains_eager(Word.phrases)).\
        filter(Word.id.in_(word_ids)).\
        filter(Phrase.active == True)
    

    【讨论】:

    • 不幸的是,这是我已经尝试过的选项之一,我一直等到今天才可以测试它以确保它,但它不起作用。我得到与上述查询相同的结果。
    • 好的,好像我可能有一些奇怪的缓存问题,但无论如何,这确实有效。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2011-03-20
    • 2016-03-14
    • 2012-11-11
    • 2014-08-13
    • 2016-08-23
    • 1970-01-01
    • 2021-12-17
    • 1970-01-01
    相关资源
    最近更新 更多