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 M2
model dan M1
objek relatifnya menggunakan select_relation
bidang dan M3
objek menggunakan prefetch_relation
bidang.
Namun seperti yang telah kami sebutkan M1
relasinya dari M2
a ForeignKey
, hanya mengembalikan 1 record untuk M2
objek apa pun . Hal yang sama berlaku OneToOneField
juga.
Tapi M3
hubungan dari M2
adalah ManyToManyField
yang dapat mengembalikan sejumlah M1
objek.
Pertimbangkan kasus di mana Anda memiliki 2 M2
objek m21
, m22
yang memiliki 5M3
objek terkait yang sama dengan ID 1,2,3,4,5
. Ketika Anda mengambil M3
objek terkait untuk masing-masing M2
objek tersebut, jika Anda menggunakan pilih terkait, ini adalah cara kerjanya.
Langkah:
- Temukan
m21
objek.
- Permintaan semua
M3
objek yang terkait dengan m21
objek yang memiliki ID 1,2,3,4,5
.
- Ulangi hal yang sama untuk
m22
objek dan semua M2
objek lainnya .
Karena kami memiliki 1,2,3,4,5
ID yang sama untuk keduanya m21
, m22
objek, 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 M2
objek, itu akan membuat catatan dari semua ID yang dikembalikan objek Anda (Catatan: hanya ID) saat melakukan kueri M2
tabel dan sebagai langkah terakhir, Django akan membuat kueri ke M3
tabel dengan set semua ID yang M2
objek Anda telah kembali. dan bergabung dengan mereka ke M2
objek menggunakan Python, bukan database.
Dengan cara ini Anda hanya menanyakan satu M3
objek sekali saja yang meningkatkan kinerja.