小能豆

如何选择性地加载已存在的过滤关系

py

我正在使用 SQLAlchemy 0.9.8

我有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部分看起来是多余的。我相信应该有更好的方法来做到这一点。

我怎样才能简化这一点?


阅读 27

收藏
2024-11-05

共1个答案

小能豆

您可以relationship直接使用而不是第一部分的连接条件join

.outerjoin(ArticleL10n, and_(Article.l10n, ArticleL10n.lang == "en"))
2024-11-05