2011-09-30 101 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