编辑: 请原谅,因为我刚刚意识到我在下面的示例中犯了一个错误。这是我想要实现的目标:
假设我有如下所述的三个表。当用户输入查询时,它将在所有三个表中搜索名称为 LIKE %query% 的结果,但只返回唯一结果。
这是一些示例数据和输出:
数据:
**Grandchild:**
id: 1
name: John
child_id: 1
**Grandchild:**
id: 2
name: Jesse
child_id: 2
**Child:**
id: 1
name: Joshua
parent_id: 1
**Child:**
id: 2
name: Jackson
parent_id: 1
**Parent:**
id: 1
name: Josie
如果用户搜索“j”,它将返回两个 Grandchild 条目:John 和 Jesse。如果用户搜索“j, Joshua”,它将只返回其孩子是 Joshua 的 Grandchildren - 在这种情况下,只有 John。
本质上,我想搜索所有的孙子条目,然后如果用户输入更多的关键词,它会根据他们相关的子条目的名称过滤这些孙子。“j”将返回所有以“j”开头的孙子,“j, Josh”将返回所有以“j”开头且拥有 Child LIKE %Josh% 的孙子。
所以,我有这样的设置:
Grandchild{
id
name
child_id
}
Child{
id
name
parent_id
}
Parent{
id
name
}
孙子链接/映射到孩子。Child 映射到 Parent。
我想做的是如下所示,我一次搜索所有三个数据库:
return Grandchild.query.filter(or_(
Grandchild.name.like("%" + query + "%"),
Grandchild.child.name.like("%" + query + "%"),
Grandchild.child.parent.name.like("%" + query + "%")
)).all()
显然上面的查询是不正确的,并返回一个错误:
AttributeError: Neither 'InstrumentedAttribute' object nor 'Comparator' object has an attribute 'name'
我正在尝试的正确方法是什么?
我正在运行 MySQL、Flask-SQLAlchemy(我相信它扩展了 SQLAlchemy)、Flask。