如何急切加载可选地存在过滤关系

时间:2014-12-23 13:49:00

标签: python sqlalchemy

我正在研究SQLAlchemy 0.9.8

此问题与“How to filter by joinloaded table in SqlAlchemy?”有关,但不相同。

我有Article个实体,可选ArticleL10n实体进行本地化。

Base = declarative_base()

class Article(Base):
    __tablename__ = 'article'
    id = Column(Integer, primary_key=True)
    title = Column(String(255))
    l10n = relationship("ArticleL10n",
            collection_class=attribute_mapped_collection('lang'),
            cascade="all, delete-orphan")

class ArticleL10n(Base):
    __tablename__ = 'article_10n'
    article_id = Column(Integer, ForeignKey('article.id'), primary_key=True)
    lang = Column(String(15), primary_key=True)
    title = Column(String(255))

我想用热切的加载Article特定语言来查询ArticleL10n列表。

我试过了:

session.query(Article) \
    .outerjoin(Article.l10n) \
    .options(contains_eager(Article.l10n)) \ 
    .filter(ArticleL10n.lang == "en") \
    .all()

这不起作用,因为如果文章没有"en"本地化,则会过滤掉。

我目前的工作代码是:

session.query(Article) \
    .outerjoin(ArticleL10n, and_(ArticleL10n.article_id == Article.id, ArticleL10n.lang == "en")) \
    .options(contains_eager(Article.l10n)) \ 
    .all()

这似乎有效。但我不喜欢这个,因为ArticleL10n.article_id == Article.id部分看起来多余。我相信应该有更好的方法来做到这一点。

我该如何简化?

1 个答案:

答案 0 :(得分:0)

您可以直接使用relationship代替join第一部分的加入条件:

.outerjoin(ArticleL10n, and_(Article.l10n, ArticleL10n.lang == "en"))