1

アイテムとタグの m2m 関係があります。リストされたすべてのタグを持つすべてのアイテムを取得する動的 AND クエリを作成できるようにしたいと考えています。

これは実用的な例ですが、動的(ランダムな量のタグ)にしたいと考えています。

return Item.query.filter(Item.item_tag.any(name = 'test'))\
.filter(Item.item_tag.any(name = 'tag'))\
.filter(Item.item_tag.any(name = 'tag1'))\
.filter(Item.item_tag.any(name = 'tag2'))\
.all()

これはor_の実際の例です:

tags = or_( *[Tag.name==x for x in tags] )
return Item.query.join(Tag.items).filter(tags).all()

ANDに似たものを探しています。

編集:動作するANDソリューション用に生成されたSQLは次のとおりです。

SELECT item.id AS item_id, item.title AS item_title, item.url AS item_url, item.body AS item_body, item.itempic AS item_itempic, item.time_published AS item_time_published, item.private AS item_private, item.user_id AS item_user_id FROM item WHERE (EXISTS (SELECT 1 FROM item_tag, tag WHERE item.id = item_tag.item_id AND tag.id = item_tag.tag_id AND tag.name = ?)) AND (EXISTS (SELECT 1 FROM item_tag, tag WHERE item.id = item_tag.item_id AND tag.id = item_tag.tag_id AND tag.name = ?))

編集2:

必要なものの例: Item1 には、tag1、tag2、tag3 というタグがあります。Item2 には、tag1、tag2、tag3、tag4 のタグがあります。

タグを検索する場合: tag1、tag2、tag3。item1 と item2 の両方が返されます。タグを検索する場合: tag1、tag2、tag3、tag4。item2 のみが返されます。

4

2 に答える 2

2

たぶん私は明らかなことを見逃していますが、

tags = and_( *[Tag.name==x for x in tags] )
return Item.query.join(Tag.items).filter(tags).all()

これへの参照: http://docs.sqlalchemy.org/en/rel_0_8/core/expression_api.html#sqlalchemy.sql.expression.and_

于 2013-04-10T16:54:26.967 に答える