我正在使用 SQLAlchemy 0.9.8
我有Article实体,并且它可以选择性地按ArticleL10n实体进行本地化。
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"本地化,它将被过滤掉。
"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部分看起来是多余的。我相信应该有更好的方法来做到这一点。
ArticleL10n.article_id == Article.id
我怎样才能简化这一点?
您可以relationship直接使用而不是第一部分的连接条件join:
relationship
join
.outerjoin(ArticleL10n, and_(Article.l10n, ArticleL10n.lang == "en"))