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