This answer ist korrekt mit Versionen von Django vor 1.7. Es erzeugt drei Abfragen: zuerst, holen Sie die Instanz von A
, dann holen Sie die zugehörigen Instanzen von B
und schließlich holen Sie die Instanzen von C
bezogen auf diejenigen von B
, die in der zweiten Abfrage geholt werden.
Vor Django 1.7, das ist das Beste, was Sie tun können, auch wenn die zweite Abfrage könnte theoretisch, wählen Sie alle B
Objekte zusammen mit den dazugehörigen C
Objekten durch die verbundene z
ForeignKey
.
Beginnend mit Django 1.7 gibt es eine erweiterte django.db.models.Prefetch
Klasse, die genau das ermöglicht. Mit Prefetch
können Sie die queryset anpassen verwendet, um verwandte Objekte wie diese Prefetch:
foo = A.objects.prefetch_related(
Prefetch('a', queryset=B.objects.select_related('z'))
).get(pk=1)
Dies führt in nur zwei Abfragen (im Gegensatz zu drei Gegensatz, wenn prefetch_related('a__z')
verwenden) und lässt die Datenbank Pflege des zweiten nehmen, an der sollte Theoretisch ergibt sich eine etwas bessere Leistung.
Dies ist alles im Handbuch abgedeckt ... https://docs.djangoproject.com/en/dev/ref/models/querysets/, aber "ja" ist die Antwort. – demux
Eigentlich ist die Antwort "nein", der Aufruf "select_related" wie in der Frage geschrieben funktioniert nicht. Ich werde eine neue Antwort hinzufügen. Übrigens sollte der Aufruf "get" am Ende sein, nicht vor 'select_related' und' prefetch_related'. – koniiiik