2016-04-17 20 views
0

Ich verwende eine Join-basierte Vererbung - ich habe User (Eltern) und CorporateUser (Kind) Modelle. Die polymorphe Identität des Benutzers ist "user" und die des CorporateUser ist "corporate_user".
Ich habe eine Abfrage wie diese
User.query.filter(User.name.like("%"+search_text+"%"))
Ist es möglich, diese Abfrage etwas zu „Kette“, die nur Objekte vom Typ CorporateUser zurückkehren wird?
Zur Zeit füge ich nur noch ein User.query.filter(User.name.like("%"+search_text+"%")).filter(User.type == 'corporate_user') hinzu, aber das scheint nicht sehr elegant.Sqlalchemy FILTER basierend auf Subtyp

Ich bin mir bewusst, ich kann einfach tun CorporateUser.query.filter(User.name.like("%"+search_text+"%"))
aber der Punkt ist, dass ich die Filter der ersten Abfrage gegeben habe.

Danke.

Antwort

0

Die .with_entities() kann Ihnen helfen. Es gibt nicht exakt die CorporateUser zurück, sondern nur die von Ihnen definierten Felder.

query = User.query.filter(User.name.like("%"+search_text+"%")) \ 
    .filter(User.type == 'corporate_user') \ 
    .with_entities(User.corporate_user) 

Jedes Element in Ihrem Abfrageergebnis wird ein Tupel mit den definierten Entitäten sein.

Natürlich benötigt Ihr Modell die User.corporate_user Rückverweis. Aufgrund Ihrer Frage bin ich mir nicht sicher, ob Sie es haben.

+0

Ich sehe das jetzt - Entschuldigung. Ich hatte am Ende eine "Basis" GenericUser und zwei Unterklassen - NormalUser und CorporateUser - Abfrage ist jetzt viel einfacher. Auch der Ansatz, den ich nahm, ist ein .join (CorporateCustomer) nach dem. Filter - so dass der Name Filter angewendet wird und dann nur die CorporateCustomers zurückgegeben werden. –

Verwandte Themen