annotate()
إضافة حقل محسوب لكل سجل annotate()
annotate() تضيف قيمة محسوبة (غالبًا من عدّ أو تجميع علاقة) لكل سجل بنتيجة الاستعلام على حدة.
الاستخدام الأشهر: عدّ عناصر علاقة عكسية لكل سجل بنفس استعلام SQL واحد، بدل استعلام count() منفصل لكل عنصر بحلقة (نفس مشكلة N+1).
الصياغة
from django.db.models import Count
Model.objects.annotate(computed_field=Count("related_field"))📄 مثال
from django.db.models import Count
# عدد التعليقات لكل منشور بنفس الاستعلام
posts = Post.objects.annotate(comment_count=Count("comments"))
for post in posts:
print(post.title, post.comment_count) # بلا أي استعلام إضافيأهم المعاملات
| المعامل | الوظيفة |
|---|---|
| computed_field | اسم الحقل المحسوب الجديد المتاح على كل كائن بالنتيجة |
| Count(field) | عدّ عناصر علاقة مرتبطة لكل سجل |
💡 نصائح عملية
- استخدمها بدل حلقة تستدعي .count() يدويًا على علاقة لكل سجل — تحل مشكلة N+1 تمامًا مثل prefetch_related
خصائص ذات صلة
🎓 تريد فهم الصورة الكاملة خطوة بخطوة؟ ابدأ من مسار DJANGO الكامل بالعربي.