sqlalchemy: подзапрос с фильтром подзапроса - PullRequest
3 голосов
/ 30 августа 2011

В 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)

Это не может быть выражено как условие первичного соединения или вторичного соединения.Что мне делать в этом случае?

Спасибо,

1 Ответ

0 голосов
/ 30 августа 2011

Вы хотите адреса, верно?Просто выполните простой запрос с другой стороны (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()
...