Wie optimieren „select_lated' und „prefetch_lated' Django-ORM-Abfragen?

Susan Sarandon
Freigeben: 2024-10-23 22:54:29
Original
431 Leute haben es durchsucht

How Do select_related and prefetch_related Optimize Django ORM Queries?

select_lated und prefetch_lated in Django ORM verstehen

In Django sind select_lated und prefetch_lated zwei Techniken, die zur Optimierung von Datenbankabfragen und zur Verbesserung der Leistung verwendet werden. Beide beinhalten das „Verknüpfen“ von Tabellen, um zusammengehörige Daten abzurufen, allerdings auf unterschiedliche Weise.

select_related: Joins in der SQL-Abfrage

select_related führt einen SQL-JOIN durch um alle zugehörigen Daten in einer einzigen Abfrage abzurufen. Dies führt zu einer größeren Ergebnismenge, ist jedoch schneller, da keine zusätzlichen Abfragen erforderlich sind. Es ist ideal für Beziehungen, bei denen es nur ein einzelnes oder eine kleine Anzahl verwandter Objekte gibt, wie z. B. ForeignKey-Beziehungen.

prefetch_related: Python-Level Joining

prefetch_lated, hingegen verknüpft die Tabellen nicht in der SQL-Abfrage. Stattdessen ruft es nur die Primärschlüssel (IDs) der zugehörigen Objekte ab und führt dann separate Abfragen aus, um die tatsächlichen Daten in Python abzurufen. Dies führt zu kleineren SQL-Abfragen, erfordert aber zusätzliche Abfragen. Es eignet sich für Beziehungen, bei denen es eine große Anzahl verwandter Objekte gibt, wie z. B. ManyToManyFields oder Reverse ForeignKeys.

Unterschiede in der Python-Darstellung

Ein weiterer wichtiger Unterschied liegt in der Python-Darstellung der zugehörigen Objekte. Mit select_related werden in Python für jedes zugehörige Objekt doppelte Objekte erstellt. Im Gegensatz dazu verwendet prefetch_lated ein einzelnes Objekt, um jedes verwandte Objekt darzustellen, was Speicherplatz sparen kann.

Verwendungsrichtlinie

Als allgemeine Regel gilt, dass Sie „select_lated“ für Beziehungen verwenden, bei denen Sie ruft eine kleine Anzahl verwandter Objekte ab. Für Beziehungen mit einer großen Anzahl verwandter Objekte verwenden Sie prefetch_lated.

Beispiel

Berücksichtigen Sie die folgenden Django-Modelle:

<code class="python">class Publisher(models.Model):
    name = models.CharField(max_length=255)

class Author(models.Model):
    name = models.CharField(max_length=255)
    publisher = models.ForeignKey(Publisher)

class Book(models.Model):
    title = models.CharField(max_length=255)
    author = models.ForeignKey(Author)</code>
Nach dem Login kopieren

Um alle abzurufen Bücher mit ihren jeweiligen Autoren und Verlagen mithilfe von „select_related“:

<code class="python">books = Book.objects.select_related('author', 'author__publisher').all()</code>
Nach dem Login kopieren

Um alle Autoren mit ihren jeweiligen Büchern mithilfe von „prefetch_lated“ abzurufen:

<code class="python">authors = Author.objects.prefetch_related('book_set').all()</code>
Nach dem Login kopieren

Im Beispiel „prefetch_lated“ sind die Book-Objekte nicht sofort verfügbar verfügbar für die Autorenobjekte. Stattdessen muss explizit auf „author.book_set“ zugegriffen werden, um die Bücher abzurufen.

Denken Sie daran, dass der beste Ansatz für Ihr Projekt von den spezifischen Anforderungen und Dateneigenschaften abhängt. Es wird empfohlen, mit beiden Techniken zu experimentieren, um herauszufinden, welche die optimale Leistung bringt.

Das obige ist der detaillierte Inhalt vonWie optimieren „select_lated' und „prefetch_lated' Django-ORM-Abfragen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage