Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimana Select_related dan prefetch_related Mengoptimumkan Pertanyaan ORM Django?

Bagaimana Select_related dan prefetch_related Mengoptimumkan Pertanyaan ORM Django?

Susan Sarandon
Susan Sarandonasal
2024-10-23 22:54:29354semak imbas

How Do select_related and prefetch_related Optimize Django ORM Queries?

Memahami select_related dan prefetch_related dalam Django ORM

Dalam Django, select_related dan prefetch_related ialah dua teknik yang digunakan untuk mengoptimumkan pertanyaan pangkalan data dan meningkatkan prestasi. Kedua-duanya melibatkan "menyertai" jadual untuk mendapatkan semula data yang berkaitan, tetapi mereka melakukannya dengan cara yang berbeza.

select_related: Menyertai dalam SQL Query

select_related melakukan SQL JOIN untuk mengambil semua data berkaitan dalam satu pertanyaan. Ini menghasilkan set hasil yang lebih besar, tetapi ia lebih pantas kerana ia menghilangkan keperluan untuk pertanyaan tambahan. Ia sesuai untuk perhubungan yang hanya terdapat satu atau sebilangan kecil objek berkaitan, seperti perhubungan ForeignKey.

prefetch_related: Python-Level Joining

prefetch_related, sebaliknya, tidak menyertai jadual dalam pertanyaan SQL. Sebaliknya, ia hanya mengambil kunci utama (ID) objek yang berkaitan dan kemudian melaksanakan pertanyaan berasingan untuk mendapatkan semula data sebenar dalam Python. Ini membawa kepada pertanyaan SQL yang lebih kecil, tetapi memerlukan pertanyaan tambahan. Ia sesuai untuk perhubungan di mana terdapat sejumlah besar objek berkaitan, seperti ManyToManyFields atau reverse ForeignKeys.

Perbezaan dalam Perwakilan Python

Perbezaan utama lain terletak pada Perwakilan Python bagi objek yang berkaitan. Dengan select_related, objek pendua dicipta dalam Python untuk setiap objek berkaitan. Sebaliknya, prefetch_related menggunakan objek tunggal untuk mewakili setiap objek berkaitan, yang boleh menjimatkan memori.

Garis Panduan Penggunaan

Sebagai peraturan umum, gunakan select_related untuk perhubungan di mana anda akan mendapatkan semula sebilangan kecil objek berkaitan. Untuk perhubungan dengan sebilangan besar objek berkaitan, gunakan prefetch_related.

Contoh

Pertimbangkan model Django berikut:

<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>

Untuk mengambil semua buku dengan pengarang dan penerbit masing-masing menggunakan select_related:

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

Untuk mengambil semua pengarang dengan buku masing-masing menggunakan prefetch_related:

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

Dalam contoh prefetch_related, objek Buku tidak serta-merta tersedia pada objek Pengarang. Sebaliknya, author.book_set mesti diakses secara eksplisit untuk mendapatkan semula buku.

Ingat, pendekatan terbaik untuk projek anda akan bergantung pada keperluan khusus dan ciri data. Adalah disyorkan untuk mencuba kedua-dua teknik untuk menentukan yang menghasilkan prestasi optimum.

Atas ialah kandungan terperinci Bagaimana Select_related dan prefetch_related Mengoptimumkan Pertanyaan ORM Django?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn