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 الكامل بالعربي.