我正在研究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
部分看起来多余。我相信应该有更好的方法来做到这一点。
我该如何简化?
答案 0 :(得分:0)
您可以直接使用relationship
代替join
第一部分的加入条件:
.outerjoin(ArticleL10n, and_(Article.l10n, ArticleL10n.lang == "en"))