我正在尝试查询拥有所有请求技能的人员.不确定动态构建查询的最佳方法是什么.
ORM对象在下面.人与技能之间的多对多,连接表不包括在这里:
Person
name=John, skills=[Skill(id=1)] # John knows Python
name=Eve, skills=[Skill(id=1), Skill(id=2)] # Eve knows Python and SQLAlchemy
Skill
id=1, name=Python
id=2, name=SQLAlchemy
id=3, name=Social skills
Run Code Online (Sandbox Code Playgroud)
在搜索页面上,用户选择一项或多项技能,并根据此创建人员的搜索结果.假设用户想要找到一个知道Python和SQLAlchemy的人.应用程序从表单提交中获取两个ID的列表,[1,2].我得到了以下查询工作,找到匹配技能的人:
session.query(Person)./
join(Skill, Person.skills).filter(Skill.id.in_(list_of_skill_ids))
Run Code Online (Sandbox Code Playgroud)
但是,使用in_子句会导致找到John人员,因为他具有所需技能之一.但搜索结果应仅显示具有所有所需技能的人员.基本上我想要的是像in_()但是用户而不是或匹配id列表.我可能应该用这个替换in_()部分,它不直接获取id列表:
filter(Person.id == 1, Person.id == 2)
Run Code Online (Sandbox Code Playgroud)
但是,使用从表单中收到的技能ID列表以编程方式构建查询的最简单方法是什么?id的数量可以是1..n.或者这甚至是通过其子女查询父母的正确方法?