編集: すみません、以下の例で間違いを犯したことに気づきました。これが私が達成したいことです:
以下に説明する 3 つのテーブルがあるとします。ユーザーがクエリを入力すると、名前が LIKE %query% である結果の 3 つのテーブルすべてが検索されますが、一意の結果のみが返されます。
データと出力の例を次に示します。
データ:
**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」を検索すると、John と Jesse の 2 つの孫エントリが返されます。ユーザーが「j, Joshua」を検索すると、子が Joshua である孫のみが返されます。この場合は、John のみです。
基本的に、すべての孫エントリを検索したいのですが、ユーザーがさらにキーワードを入力すると、関連する子エントリの名前に基づいてそれらの孫をフィルタリングします。"j" は、"j" で始まるすべての孫を返します。"j, Josh" は、"j" で始まり、%Josh% に似た子を持つすべての孫を返します。
だから、私はこのような設定をしています:
Grandchild{
id
name
child_id
}
Child{
id
name
parent_id
}
Parent{
id
name
}
孫は子にリンク/マップされます。子は親にマップされます。
私がやりたいことは、次のようなもので、3 つのデータベースすべてを一度に検索します。
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を実行しています。