2011-10-17 11 views
7

2 modelim var, Document ve Person. Document, "owner" özelliği aracılığıyla Person ile ilişki kurdu. Şimdi:SqlAlchemy'de birleştirilmiş tabloya nasıl filtre uygulanmaktadır?

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

tablo Person katılmak katına olacaktır. Bir kişi tablosu seçilecek ve iki katına çıkacak olan filtrelenecek, tam olarak istediğim gibi değil, bu şekilde belge satırları filtrelenmeyecek.

Birleştirilen tablo/model üzerinde filtre uygulamak için ne yapabilirim?

cevap

14

Haklısınız, masa Person çıkan SQL iki kez kullanılacaktır, ancak bunların her biri farklı bir amaca hizmet eder: filter(Person.is_deleted != True)

  • diğer istekli olmaktır:

    • bir koşula filtre etmektir ilişkiyi yük: filtre koşulu tam değildir çünkü options(joinedload('owner'))

    Ama sorgu yanlış sonuçlar verir nedenidir. Doğru sonuçlar elde hale getirmek için, ayrıca iki model JOIN gerekir:

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

    Bu hala Person masaya 2 referansları (JOIN) sahip olacak olsa bile, doğru satır dönecektir. Sorgunuza yönelik gerçek çözüm, joinedload yerine contains_eager kullanılmasının

    qry = (session.query(Document). 
         join(Document.owner). # THIS IS STILL IMPORTANT 
         options(contains_eager(Document.owner)). 
         filter(Person.is_deleted != True) 
         ) 
    
  • İlgili konular