sqlalchemy:在子查询上使用过滤器的子查询

时间:2011-08-29 21:59:18

标签: python sqlalchemy relationship

在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 :(得分: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()