2009-08-06 3 views
1

Ich habe ein Django-Modell namens Collection, das eine Sammlung von Elementen (CollectionItem) darstellt. Jede Sammlung enthält nur Elemente eines bestimmten Typs. (CollectionItem hat einen Fremdschlüssel für die Sammlung).Verkettung von Django QuerySets in einer Schleife Das Richtige für Sie?

Ich möchte alle CollectionItems abrufen, die sich in öffentlich gekennzeichneten Listen eines bestimmten Typs befinden, und sie nach einem bestimmten Feld sortiert zurückgeben. Hier ist die Abfrage-Code, die ich benutze:

lists = Collection.objects.filter(is_public=True, type=7) 
items = CollectionItem.objects.none() 
for list in lists: 
    items |= CollectionItem.objects.filter(collection=list) 
items = items.order_by('name') 

Ich muss sich vorstellen, dass dies nicht gut auf allen skaliert, wenn ich eine große Datenbank mit jeder Menge von Listen und Einzelteile haben. Gibt es einen besseren Weg, dies in Django zu tun? Oder ist die Ineffizienz, die an der Abfrageschleife beteiligt ist, vernachlässigbar genug im Vergleich zu anderen Optionen, die ich mir nicht zu viele Sorgen machen sollte?

Antwort

8

Klingt wie Sie brauchen nur:

items = CollectionItem.objects.filter(
        collection__is_public=True, collection__type=7 
       ).order_by('name') 
+0

Nizza, danke. Das ist viel hübscher. –