หายไปจากคำตอบที่โพสต์แล้ว แค่คิดว่ามันจะดีกว่าถ้าฉันเพิ่มคำตอบด้วยตัวอย่างจริง
สมมติว่าคุณมีโมเดล Django 3 แบบที่เกี่ยวข้องกัน
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)
ที่นี่คุณสามารถเคียวรีM2
โมเดลและM1
อ็อบเจ็กต์ที่เกี่ยวข้องโดยใช้select_relation
ฟิลด์และM3
อ็อบเจ็กต์ที่ใช้prefetch_relation
ฟิลด์
อย่างไรก็ตามตามที่เราได้กล่าวถึงM1
ความสัมพันธ์ของจากM2
a ForeignKey
มันจะส่งกลับเพียง1ระเบียนสำหรับM2
วัตถุใด ๆ สิ่งเดียวกันใช้สำหรับOneToOneField
เช่นกัน
แต่M3
ความสัมพันธ์จากM2
นั้นเป็นสิ่งManyToManyField
ที่อาจส่งคืนจำนวนM1
วัตถุใด ๆ
พิจารณากรณีที่คุณมี 2 M2
วัตถุm21
, m22
ที่มีเดียวกัน5ที่เกี่ยวข้องวัตถุที่มีรหัสM3
1,2,3,4,5
เมื่อคุณดึงข้อมูลM3
วัตถุที่เกี่ยวข้องสำหรับวัตถุเหล่านั้นM2
ถ้าคุณใช้ตัวเลือกที่เกี่ยวข้องนี่จะเป็นวิธีการทำงาน
ขั้นตอน:
- ค้นหา
m21
วัตถุ
- แบบสอบถามทั้งหมด
M3
วัตถุที่เกี่ยวข้องกับm21
วัตถุที่มี ID 1,2,3,4,5
ที่
- ทำซ้ำสิ่งเดียวกันสำหรับ
m22
วัตถุและM2
วัตถุอื่นทั้งหมด
เนื่องจากเรามี1,2,3,4,5
ID เดียวกันทั้งm21
อm22
อบเจ็กต์ถ้าเราใช้ตัวเลือก select_related มันจะทำการสืบค้น DB สองครั้งสำหรับ ID เดียวกันซึ่งถูกดึงออกมาแล้ว
แต่ถ้าคุณใช้ prefetch_related เมื่อคุณพยายามรับM2
วัตถุมันจะจดบันทึก ID ทั้งหมดที่วัตถุของคุณส่งคืน (หมายเหตุ: เฉพาะ ID เท่านั้น) ในขณะที่ทำการสืบค้นM2
ตารางและในขั้นตอนสุดท้าย Django จะทำการสืบค้นที่M3
ตาราง ด้วยชุดของ ID ทั้งหมดที่M2
วัตถุของคุณส่งคืน และเข้าร่วมกับM2
วัตถุโดยใช้ Python แทนฐานข้อมูล
วิธีนี้คุณจะทำการค้นหาM3
วัตถุทั้งหมดเพียงครั้งเดียวซึ่งจะปรับปรุงประสิทธิภาพ