SQLAlchemy - 从字典动态构建查询过滤器

41 投票
1 回答
34718 浏览
提问于 2025-04-17 03:23

我有一个从网页传过来的字典(dict)。我想根据这个字典动态构建查询。 我知道我可以这样做:

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))

我不太确定该如何从这里构建查询。如果能得到一些帮助就太好了。

1 个回答

59

你走在正确的道路上!

首先,你需要改变的一点是,使用 getattr 来访问属性,而不是用 __dict__;因为 getattr 总是能正确处理,即使在一些复杂的模型中,映射的属性可能不是列属性。

另一个缺失的部分是,你可以多次使用 filter(),并用这个方法调用的结果来替换旧的查询对象。简单来说就是:

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

撰写回答