私は Flask-SQLAlchemy を使用して Flask で作業しており、多対多対多の関係を設定しようとしています。クライアントは複数の注文を持つことができ、注文は複数のクライアント (多対多) を持つこともできます。各注文には、一意のアイテムのリストが含まれています (1 対多)。
SQLAlchemy のドキュメントに従って、多対多の関係の関連付けテーブルをセットアップし、1 対多の関係には通常の関係/外部キーを使用しました。すべての参照は に設定されlazy='dynamic'
ます。
association_table = Table('association', Base.metadata,
Column('left_id', Integer, ForeignKey('left.id')),
Column('right_id', Integer, ForeignKey('right.id'))
)
items
クライアントに関連付けられたすべてを取得する効率的な方法は何ですか? うまく[item for item in order.items.all() for order in client.orders]
いくと思いますが(上記の問題は少ない)、もっと効率的な方法はありますか?結果を並べ替える必要がある場合はどうなりますか?
アップデート
次の 2 つの方法 (Audrius の回答の最初の方法) によって、クライアントの注文のアイテムを取得する 2 つの方法を知っています。
db.session.query(Item).\
join(Order).join(Order.clients).\
filter(Client.id == 42).\
order_by(Item.timestamp)
と
Item.query.filter(Item.order_id._in(client.order_ids)).order_by(Item.timestamp)
どちらも同じ結果が得られると思いますが、効率のためにどちらを優先する必要がありますか?