F()
الإشارة لقيمة حقل داخل الاستعلام نفسه F()
F() تشير لقيمة حقل موجود بقاعدة البيانات نفسها داخل الاستعلام، فتُمكّنك من مقارنة حقلين ببعض أو تحديث حقل بالاعتماد على قيمته الحالية — بجملة SQL واحدة آمنة من تعارض التزامن (race condition).
بدون F، زيادة عدّاد تتطلب قراءة القيمة الحالية بـ Python ثم كتابتها من جديد — خطوتان منفصلتان قد يتداخل بينهما طلب آخر (race condition) فتُفقد إحدى الزيادات. F() تنقل العملية بالكامل لقاعدة البيانات كخطوة ذرّية واحدة.
الصياغة
from django.db.models import F
Model.objects.filter(...).update(field=F("field") + value)📄 مثال
from django.db.models import F
# ❌ عرضة لتعارض التزامن: قراءة ثم كتابة بخطوتين منفصلتين
post = Post.objects.get(pk=1)
post.views = post.views + 1
post.save()
# ✅ آمن وذرّي: خطوة واحدة بقاعدة البيانات مباشرة
Post.objects.filter(pk=1).update(views=F("views") + 1)
# مقارنة بين حقلين بنفس السجل
Post.objects.filter(comments_count__gt=F("views"))أهم المعاملات
| المعامل | الوظيفة |
|---|---|
| F("field") | مرجع لقيمة حقل حالية بقاعدة البيانات، قابل لعمليات حسابية (+ - * /) |
💡 نصائح عملية
- استخدمها دائمًا لعدّادات تُحدَّث بتزامن عالٍ (مشاهدات، إعجابات) بدل قراءة/تعديل/حفظ يدوي بثلاث خطوات
⚠️ أخطاء شائعة
- استخدام F() بعملية update() تحتاج عبور علاقة (JOIN) — غير مدعوم، ترمي FieldError؛ F() تعمل فقط ضمن حقول نفس الجدول بعمليات update()
خصائص ذات صلة
🎓 تريد فهم الصورة الكاملة خطوة بخطوة؟ ابدأ من مسار DJANGO الكامل بالعربي.