2011-10-17 16 views
7

Diciamo che ho 2 modelli, Document e Person. Document ha relazione con Person tramite la proprietà "owner". Ora:Come filtrare per tabella joinloaded in SqlAlchemy?

session.query(Document)\ 
    .options(joinedload('owner'))\ 
    .filter(Person.is_deleted!=True) 

raddoppierà unirsi tavolo Person. La tabella di una persona verrà selezionata e quella raddoppiata verrà filtrata, il che non è esattamente ciò che voglio in questo modo in quanto le righe del documento non verranno filtrate.

Cosa posso fare per applicare il filtro sulla tabella/modello joinloaded?

risposta

14

Hai ragione, tavolo Person saranno utilizzati due volte nel risultante SQL, ma ciascuno di essi serve scopo diverso:

  • uno è quello di filtrare la condizione: filter(Person.is_deleted != True)
  • l'altro è quello di ansiosi caricare il rapporto: options(joinedload('owner'))

Ma la ragione per la vostra query restituisce risultati errati è perché la vostra condizione di filtro non è completa. Al fine di rendere più produrre i risultati giusti, è inoltre necessario unire i due modelli:

qry = (session.query(Document). 
     join(Document.owner). # THIS IS IMPORTANT 
     options(joinedload(Document.owner)). 
     filter(Person.is_deleted != True) 
     ) 

Ciò restituirà righe corrette, anche se avrà ancora 2 referenze (join) per Person tavolo. La vera soluzione alla tua domanda è che usando contains_eager invece di joinedload:

qry = (session.query(Document). 
     join(Document.owner). # THIS IS STILL IMPORTANT 
     options(contains_eager(Document.owner)). 
     filter(Person.is_deleted != True) 
     ) 
Problemi correlati