如何过滤连接表结果? 我有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)
使用 PropComparator.and_ 添加
on
子句。
select(Tag).join(
Tag.users.and_(Users.is_active == True)
)
有关更多信息,请参阅 SQLAlchemy 文档中的将关系与自定义 ON Criteria 结合。