2016-06-23 8 views
1

ManyToManyからクエリーセットにすべてのレコードを取得する最も効率的な方法は何ですか?他のクエリーセットからのクエリーセット

例を挙げれば、モデル番号ItemsのManyToManyを持つEventsというモデルがあり、Eventsを含むクエリセットがあります。クエリーセットのすべてのEventsがオンであるすべてのItemsを含むクエリーセットを取得するにはどうすればよいですか?

単一イベントの場合は、Events.items.all()となります。しかし、これはクエリーセットなので、私はそれをすることはできません。

おかげ

答えて

1

Items.filter(event_set__in=some_events_qs)を意志それをやる。これは遅延評価されたネストされたクエリを使用しますが、パフォーマンスに関する考慮事項はnoted in the docsです。

Itemが初期クエリーセットの複数のイベントに属している場合、これは重複を返す可能性があります。その場合は、.distinct()がクリーンアップされますが、パフォーマンスに影響を与える可能性もあります。

0

はDjangoはDBの数を最小化するprefetch_relatedは関連オブジェクトをフェッチするために当たった:

これは プリフェッチ多対多および多対一のオブジェクトにそれを可能にします、 select_relatedでサポートされている外部キーと1対1の の関係に加えて、select_relatedを使用して を使用することはできません。

あなたのクエリが表示されます:

events = events.objects.all().prefetch_related('items') 

および関連するオブジェクトを:

items = [e.items.all() for e in events] 

eventは、単一のオブジェクトであれば、それはなります

event = events.objects.get(id=id).prefetch_related('items') 
# items related to that event 
items = event.items.all() 
+0

こんにちはmoses、私はすでにprefetch_related()を知っているそれは私が求めているものではない.. 'items = [e.items.all()for events in e]'は私にアイテムを与えるだろうが、リスト*ではなくアイテム*のクエリセットを探しています(たとえば、フェッチする前に他のフィルタを適用したいなど)。また、私はここで間違っているかもしれませんが、私はその最も効率的な方法を疑う。 –

+1

それからあなたは[this]を見ているかもしれません(http://stackoverflow.com/questions/12973929/why-does-djangos-prefetch-related-フィルタリングされたすべてのフィルタリングされたフィルタリングされたフィルタリングされたフィルタリングされたフィルタリングされた'prefetch_related'を使わずに関連するオブジェクトを直接取得した場合にフィルタリングすることができます –

関連する問題