Die bereits veröffentlichten Antworten sind durchgegangen. Ich dachte nur, es wäre besser, wenn ich eine Antwort mit einem tatsächlichen Beispiel hinzufügen würde.
Angenommen, Sie haben 3 verwandte Django-Modelle.
class M1(models.Model):
name = models.CharField(max_length=10)
class M2(models.Model):
name = models.CharField(max_length=10)
select_relation = models.ForeignKey(M1, on_delete=models.CASCADE)
prefetch_relation = models.ManyToManyField(to='M3')
class M3(models.Model):
name = models.CharField(max_length=10)
Hier können Sie das M2
Modell und seine relativen M1
Objekte mithilfe von select_relation
Feld und M3
Objekte mithilfe von prefetch_relation
Feld abfragen .
Wie bereits erwähnt M1
, gibt die Beziehung von M2
a ForeignKey
nur 1 Datensatz für ein M2
Objekt zurück. Gleiches gilt OneToOneField
auch.
Aber M3
die Beziehung von M2
ist eine, ManyToManyField
die eine beliebige Anzahl von M1
Objekten zurückgeben kann.
Betrachten wir einen Fall , in dem Sie 2 haben M2
Objekte m21
, m22
die gleiche haben 5 zugehörigen M3
Objekte mit IDs 1,2,3,4,5
. Wenn Sie zugeordnete M3
Objekte für jedes dieser M2
Objekte abrufen und select related verwenden, funktioniert dies folgendermaßen.
Schritte:
m21
Objekt suchen .
- Fragen Sie alle
M3
Objekte ab, die sich auf ein m21
Objekt beziehen, dessen IDs sind 1,2,3,4,5
.
- Wiederholen Sie dasselbe für das
m22
Objekt und alle anderen M2
Objekte.
Wie wir gleiche haben 1,2,3,4,5
IDs für beide m21
, m22
Objekte, wenn wir Option select_related verwenden, ist es die DB zweimal für den gleichen IDs abzufragen geht , die bereits abgerufen wurden.
Wenn Sie stattdessen prefetch_related verwenden und versuchen, M2
Objekte abzurufen, werden alle IDs notiert, die Ihre Objekte zurückgegeben haben (Hinweis: nur die IDs), während Sie die M2
Tabelle abfragen. Als letzten Schritt wird Django eine Abfrage an die M3
Tabelle durchführen mit dem Satz aller IDs, die Ihre M2
Objekte zurückgegeben haben. und verbinden Sie sie mit M2
Objekten mit Python anstelle der Datenbank.
Auf diese Weise fragen Sie alle M3
Objekte nur einmal ab, was die Leistung verbessert.