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

select_related()

تحسين استعلامات العلاقات (ForeignKey) select_related()

select_related() تجلب الكائنات المرتبطة عبر ForeignKey/OneToOne بنفس استعلام SQL واحد (JOIN) بدل استعلام منفصل لكل وصول.

بدون select_related، الوصول لـ post.author.name داخل حلقة يُنفّذ استعلامًا منفصلًا لكل منشور — مشكلة N+1 query الشهيرة التي تُبطئ التطبيق كثيرًا مع بيانات حقيقية.

الصياغة

Model.objects.select_related("foreign_key_field")

📄 مثال

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

# مع select_related: استعلام واحد فقط بـ JOIN
for post in Post.objects.select_related("author"):
    print(post.author.username)  # استعلام واحد فقط

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

المعاملالوظيفة
foreign_key_fieldاسم حقل ForeignKey أو OneToOneField المراد جلبه مسبقًا بنفس الاستعلام

💡 نصائح عملية

  • استخدمها دائمًا عند الوصول لحقول علاقة ForeignKey داخل حلقة على قائمة نتائج
  • استخدم prefetch_related بدلًا منها للعلاقات العكسية أو ManyToMany

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

  • نسيانها عند المرور بحلقة على استعلام والوصول لعلاقة ForeignKey بكل تكرار — مشكلة N+1 queries الأشهر بـ Django

خصائص ذات صلة

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