如何选择过滤关系

2024-09-29 23:16:17 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在研究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列表。你知道吗

我试过:

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部分看起来是多余的。我相信应该有更好的办法。你知道吗

我怎样才能简化这个?你知道吗


Tags: keyidtruelangbasestringarticlel10n

热门问题