Bagaimana Select_related dan prefetch_related Mengoptimumkan Pertanyaan ORM Django?

Susan Sarandon
Lepaskan: 2024-10-23 22:54:29
asal
354 orang telah melayarinya

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>
Salin selepas log masuk

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>
Salin selepas log masuk

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

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

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!

sumber:php
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!