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!