永久过滤 SQLAlchemy 关系

Permanently filter a SQLAlchemy relationship

我有一个通过 GroupMember 关联模型属于多个组的用户模型。我使用软删除,因此目前 user.groups 可以包括已删除的组。是否有我可以应用于关系的永久过滤器,因此它不包括已删除的实例?

class User(Base):
    # ...
    groups = relationship(
        'group',
        secondary=GroupMember.__table__,
        order_by=GroupMember.position
    )

通过指定 primaryjoin 更改关系的连接条件。

groups = relationship(
    Group, GroupMemeber.__table__,
    primaryjoin=lambda: and_(not_(Group.deleted), GroupMemeber.user_id == User.id)
)

请注意,这不会阻止您向成员添加已删除的群组。 SQLAlchemy 不知道 primaryjoin 是干什么的,它只知道模型之间的基本关系。当 primaryjoin 条件不再为真时,SQLAlchemy 也不会删除关联。为了查看与成员关联的 实际 组集合,建立第二个 all_groups 关系会很有用。