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