Pergi melalui jawaban yang sudah diposting. Hanya berpikir akan lebih baik jika saya menambahkan jawaban dengan contoh aktual.
Katakanlah Anda memiliki 3 model Django yang terkait.
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)
Di sini Anda dapat meminta M2model dan M1objek relatifnya menggunakan select_relationbidang dan M3objek menggunakan prefetch_relationbidang.
Namun seperti yang telah kami sebutkan M1relasinya dari M2a ForeignKey, hanya mengembalikan 1 record untuk M2objek apa pun . Hal yang sama berlaku OneToOneFieldjuga.
Tapi M3hubungan dari M2adalah ManyToManyFieldyang dapat mengembalikan sejumlah M1objek.
Pertimbangkan kasus di mana Anda memiliki 2 M2objek m21, m22yang memiliki 5M3 objek terkait yang sama dengan ID 1,2,3,4,5. Ketika Anda mengambil M3objek terkait untuk masing-masing M2objek tersebut, jika Anda menggunakan pilih terkait, ini adalah cara kerjanya.
Langkah:
- Temukan
m21objek.
- Permintaan semua
M3objek yang terkait dengan m21objek yang memiliki ID 1,2,3,4,5.
- Ulangi hal yang sama untuk
m22objek dan semua M2objek lainnya .
Karena kami memiliki 1,2,3,4,5ID yang sama untuk keduanya m21, m22objek, jika kami menggunakan opsi select_related, itu akan meminta DB dua kali untuk ID yang sama yang sudah diambil.
Alih-alih jika Anda menggunakan prefetch_related, ketika Anda mencoba untuk mendapatkan M2objek, itu akan membuat catatan dari semua ID yang dikembalikan objek Anda (Catatan: hanya ID) saat melakukan kueri M2tabel dan sebagai langkah terakhir, Django akan membuat kueri ke M3tabel dengan set semua ID yang M2objek Anda telah kembali. dan bergabung dengan mereka ke M2objek menggunakan Python, bukan database.
Dengan cara ini Anda hanya menanyakan satu M3objek sekali saja yang meningkatkan kinerja.