2016-06-23 14 views
1

Was ist der effizienteste Weg, um alle Datensätze von einem ManyToMany in ein Abfrage-Set zu bekommen?django queryset von anderen querieset manytomany

Um ein Beispiel zu geben, Wenn ich ein Modell mit dem Namen Events, die eine ManyToMany zu einem Modell namens Items hat, und ich habe ein Abfrage-Set, das Events enthält. Wie bekomme ich das Abfrage-Set, das alle Items enthält, die alle Events im Abfrage-Set-Punkt auf?

Wenn es ein einzelnes Ereignis wäre, wäre es: Events.items.all(). aber das ist ein Abfrage-Set, also kann ich es nicht tun.

Dank

Antwort

1

Items.filter(event_set__in=some_events_qs) wird TU es. Dies verwendet eine träge ausgewertete verschachtelte Abfrage - aber sehen Sie die Leistungsüberlegungen noted in the docs.

Dies kann Rückzüge zurückgeben, wenn eine Item zu mehr als einem Ereignis in der anfänglichen Abfragegruppe gehört, ich kann mich nie erinnern, wie das funktioniert. Wenn ja, .distinct() wird es aufräumen, kann aber auch eine Auswirkung auf die Leistung haben.

0

Django hat eine prefetch_related für die Anzahl der DB für das Abrufen verwandte Objekte trifft zu minimieren:

Dies ermöglicht es Prefetch-many-to-many und many-to-one-Objekte, was nicht mit select_related, zusätzlich zu den Fremdschlüssel Beziehungen, die von select_related unterstützt werden.

Ihre Anfrage wird aussehen:

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

und die damit verbundenen Objekte:

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

Wenn event ein Objekt Single wäre, würde es aussehen:

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

Hallo moses, danke, aber ich weiß bereits prefetch_related() es ist nicht genau das, was ich frage .. 'items = [e.items.all() für e in Veranstaltungen]' wird mir die Gegenstände, aber ich ' Ich suche nach einem * queryset von Elementen *, nicht einer Liste (zB möchte ich andere Filter anwenden, bevor ich sie abrufe etc.). Auch ich kann hier falsch liegen, aber ich bezweifle, dass es der effizienteste Weg ist .. –

+1

Dann können Sie sich dies [http://stackoverflow.com/questions/12973929/why-does-djangos-prefetch-related- Nur-Arbeit-mit-allem-und-nicht-Filter). Sie können filtern, wenn Sie das verwandte Objekt direkt ohne Verwendung von 'prefetch_related' erhalten –