تخطَّ إلى المحتوى

prefetch_related()

تحسين استعلامات العلاقات المتعدّدة prefetch_related()

prefetch_related() تحل نفس مشكلة N+1 لكن للعلاقات العكسية أو ManyToMany، حيث JOIN واحد غير كافٍ.

بعكس select_related (استعلام JOIN واحد)، prefetch_related تُنفّذ استعلامًا إضافيًا منفصلًا لكل علاقة، لكن استعلامًا **واحدًا فقط لكل نوع علاقة** بدل استعلام لكل سجل — تحسين هائل بالمقارنة مع عدم استخدامها.

الصياغة

Model.objects.prefetch_related("many_to_many_or_reverse_field")

📄 مثال

# بدون تحسين: استعلام منفصل لكل post.comments.all()
for post in Post.objects.all():
    print(post.comments.count())  # N+1 queries

# مع prefetch_related: استعلامان فقط بالمجمل
for post in Post.objects.prefetch_related("comments"):
    print(post.comments.count())

أهم المعاملات

المعاملالوظيفة
fieldاسم حقل ManyToMany أو علاقة عكسية (related_name)

💡 نصائح عملية

  • استخدمها لكل علاقة ManyToMany أو ForeignKey عكسية (مثل post.comments) داخل حلقة

⚠️ أخطاء شائعة

  • الخلط بينها وبين select_related — الأولى للعلاقات المتعدّدة (ManyToMany/عكسية)، الثانية للعلاقات المفردة (ForeignKey/OneToOne)

خصائص ذات صلة

🎓 تريد فهم الصورة الكاملة خطوة بخطوة؟ ابدأ من مسار DJANGO الكامل بالعربي.