prefetch_related für mehrere Ebenen
Wenn meine Modelle so Aussehen:
class Publisher(models.Model):
pass
class Book(models.Model):
publisher = models.ForeignKey(Publisher)
class Page(models.Model):
book = models.ForeignKey(Book)
und ich möchte die queryset für Publisher
ich tun Publisher.object.all()
.
Wenn Sie dann wollen, stellen Sie sicher, dass prefetch kann ich tun:
Publisher.objects.all().prefetch_related('book_set')`
Meine Fragen sind:
- Gibt es eine Möglichkeit, dies zu tun prefetching mit
select_related
oder
muss ichprefetch_related
? - Ist es ein Weg, um die prefetch
page_set
? Funktioniert nicht:
Publisher.objects.all().prefetch_related('book_set', 'book_set_page_set')
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nein, Sie können nicht
select_related
für einem umgekehrten Verhältnis.select_related
muss ein SQL-join, so einen Datensatz in der Haupt-queryset muss genau eine Referenz in die zugehörige Tabelle (ForeignKey
oderOneToOne
Felder).prefetch_related
tatsächlich eine völlig separate zweite Abfrage, speichert die Ergebnisse, dann "Verknüpfungen" in den queryset in python. So ist es erforderlich, fürManyToMany
oder reverseForeignKey
Felder.Haben Sie versucht, die zwei Unterstriche zu tun, die multi-level-prefetches? Wie diese:
Publisher.objects.all().prefetch_related('book_set', 'book_set__page_set')
Page
hat eineOneToOne
FeldTextContent
wäre es:...prefetch_related('book_set__page_set__text_contents')
oder...select_related('book_set__page_set__text_contents')
Seit Django 1.7, Instanzen von
django.db.models.Prefetch
Klasse kann verwendet werden, als ein argument von.prefetch_related
.Prefetch
Objekt-Konstruktor hat einequeryset
argument, das erlaubt, um anzugeben, mehrere verschachtelte Ebenen prefetches ähnlich:Gespeichert in Attribute mit
_list
suffix, weil ichListQuerySet
zu verarbeiten prefetch-Ergebnisse (filter /Bestellung).