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 M2Modell und seine relativen M1Objekte mithilfe von select_relationFeld und M3Objekte mithilfe von prefetch_relationFeld abfragen .
Wie bereits erwähnt M1, gibt die Beziehung von M2a ForeignKeynur 1 Datensatz für ein M2Objekt zurück. Gleiches gilt OneToOneFieldauch.
Aber M3die Beziehung von M2ist eine, ManyToManyFielddie eine beliebige Anzahl von M1Objekten zurückgeben kann.
Betrachten wir einen Fall , in dem Sie 2 haben M2Objekte m21, m22die gleiche haben 5 zugehörigen M3Objekte mit IDs 1,2,3,4,5. Wenn Sie zugeordnete M3Objekte für jedes dieser M2Objekte abrufen und select related verwenden, funktioniert dies folgendermaßen.
Schritte:
m21Objekt suchen .
- Fragen Sie alle
M3Objekte ab, die sich auf ein m21Objekt beziehen, dessen IDs sind 1,2,3,4,5.
- Wiederholen Sie dasselbe für das
m22Objekt und alle anderen M2Objekte.
Wie wir gleiche haben 1,2,3,4,5IDs für beide m21, m22Objekte, 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, M2Objekte abzurufen, werden alle IDs notiert, die Ihre Objekte zurückgegeben haben (Hinweis: nur die IDs), während Sie die M2Tabelle abfragen. Als letzten Schritt wird Django eine Abfrage an die M3Tabelle durchführen mit dem Satz aller IDs, die Ihre M2Objekte zurückgegeben haben. und verbinden Sie sie mit M2Objekten mit Python anstelle der Datenbank.
Auf diese Weise fragen Sie alle M3Objekte nur einmal ab, was die Leistung verbessert.