2011-08-29 4 views
3

sqlalchemy에서 관계의 부속 장치로 리턴 된 결과를 필터링 할 수 있습니까? (구문/API 오류를 무시하십시오) 다음 사항을 고려sqlalchemy : 부속 조회에 필터가있는 subqueryload

관계 :

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 차회 또는 2 차회 회의에서 조건으로 표현할 수 없습니다. 이 경우 어떻게해야합니까?

감사합니다.

답변

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() 
+1

내 예제는 더 큰 문제의 단순화 된 버전입니다. 이 경우 솔루션이 작동하지만 조인 조건에 조건을 추가 할 수있는 일반적인 솔루션을 찾고 있습니다. 아래에 또 다른 문제를 넣겠습니다 : – EnToutCas

+0

세입자가 동일한 테이블을 공유하고 'systemid'라는 여분의 키로 구별되는 muti-tenant 시스템이 있다고 가정합니다. 관계의 조인 조건에는 Address.systemid == User.systemid가 있지만 주어진 시스템에 대한 주소로 사용자에게 쿼리하는 동안 하위 쿼리에서 관계를로드하면 systemid = $ current_systemid를 조인 조건에 추가해야합니다 또는 전체 테이블 스캔을 수행하는 하위 쿼리로 끝납니다. 따라서''subquery.filter (Address.systemid == current_systemid)''가 필요합니다. 하위 쿼리를 필터링해야하는 이유 중 하나 일뿐입니다. – EnToutCas

+0

위대한 대답, Van ... thx! – Russ