2011-09-30 50 views
25

所以我有一個從網頁傳遞的字典。我想基於字典動態生成查詢。我知道我可以這樣做:SQLAlchemy - 從字典中動態構建查詢過濾器

session.query(myClass).filter_by(**web_dict) 

但是,只有當這些值完全匹配時才起作用。我需要做'喜歡'過濾。使用__dict__屬性我最好的嘗試:

for k,v in web_dict.items(): 
    q = session.query(myClass).filter(myClass.__dict__[k].like('%%%s%%' % v)) 

不知道如何建立從那裏查詢。任何幫助都是極好的。

回答

38

你是在正確的軌道上!

您想要做的不同的第一件事是訪問屬性使用getattr而不是__dict__; getattr將始終做正確的事情,即使(對於更復雜的模型可能如此)映射屬性不是列屬性。

另一個缺失的部分是,您可以多次指定filter(),只需用該方法調用的結果替換舊的查詢對象即可。所以基本上:

q = session.query(myClass) 
for attr, value in web_dict.items(): 
    q = q.filter(getattr(myClass, attr).like("%%%s%%" % value)) 
+2

TokenMacGuy再次罷工。提示音樂... – MFB

+1

哈哈,帶我回去... :) – MFB

+3

請不要評論垃圾郵件..! – PersianGulf