在连接表之前应用过滤器

问题描述 投票:0回答:1

如何过滤连接表结果? 我有3张桌子:

User:
 id: str
 full_name: str
 is_active: bool # NEED TO FILTER BY THIS
 tags: Mapped[list["Tag"]] = relationship(
        "Tag", secondary=user_tag, back_populates="users"
    )
Tag:
 id: str
 name: str
 users: Mapped[list["Tag"]] = relationship(
        "User", secondary=user_tag, back_populates="tags", lazy="selectin"
    )
user_tag = Table(
    "user_tag",
    Base.metadata,
    Column("user_id", ForeignKey("user.id", ondelete="CASCADE"), primary_key=True),
    Column("tag_id", ForeignKey("tag.id", ondelete="CASCADE"), primary_key=True),
)

我得到了这样的所有标签:

all_tags= await session.scalars(select(Tag))

如果我想获得此标签的所有用户,我会这样做:

all_tags_with_users = await session.scalars(select(Tag).join(Tag.users)

但是我怎样才能只加入活跃用户呢?我应该把

where
条件放在哪里?我想应该是这样的:

all_tags_with_only_active_users = await session.scalars(select(Tag).join(Tag.users, onclause=Tag.users.contains(User.id) & Tag.users.is_active=True)
python sql sqlalchemy left-join fastapi
1个回答
0
投票

使用 PropComparator.and_ 添加

on
子句。

select(Tag).join(
  Tag.users.and_(Users.is_active == True)
)

有关更多信息,请参阅 SQLAlchemy 文档中的将关系与自定义 ON Criteria 结合

© www.soinside.com 2019 - 2024. All rights reserved.