sqlalchemy: 子查询加载时对子查询进行过滤

4 投票
1 回答
2849 浏览
提问于 2025-04-17 00:35

在sqlalchemy中,能否对通过子查询加载的关系结果进行过滤?考虑以下内容(请忽略任何语法或API错误)

关系:

User.address = relationship(Address,
                            secondary = UserAddress,
                            primaryjoin = (User.userid == UserAddress.userid),
                            secondaryjoin = (UserAddress.addressid == Address.addressid))

查询:

session.query(User).options(subqueryload(User.addresses))

这将给我所有符合连接条件的地址。但是,如果我想进一步过滤这些地址呢?比如说,如果用户以访客身份登录,他/她应该只能看到其他用户的公司地址,而不能看到自己的家庭地址。那么类似于(假设的):

if user_group == 'guest':
    option = subqueryload(User.addresses).filter(Address.type != 'home')
else:
    option = subqueryload(User.addresses)
q = session.query(User).options(options)

这不能在primaryjoin或secondaryjoin中作为条件表达。那么在这种情况下我该怎么办呢?

谢谢,

1 个回答

0

你想要地址,对吧?只需要从另一边做一个简单的查询就可以了(user_id 是一个参数):

qry = session.query(Address).join(User).filter(User.id == user_id)
if user_group == 'guest':
    qry = qry.filter(Address.type != 'home')
addresses = qry.all()

撰写回答