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

update()

تحديث جماعي بلا جلب الكائنات update()

update() تُحدّث كل السجلات المطابقة بجملة SQL واحدة مباشرة، بلا تحميل الكائنات للذاكرة أو استدعاء save() على كل واحد.

أكفأ بكثير من حلقة for تستدعي save() لكل كائن، لكنها لا تستدعي save() فعليًا ولا تُطلق إشارات pre_save/post_save، ولا تحترم خيار auto_now بحقول التاريخ — قيود مهمة يجب معرفتها قبل استخدامها.

الصياغة

Model.objects.filter(...).update(field=value)

📄 مثال

from django.db.models import F

# تحديث مباشر بقيمة ثابتة
Post.objects.filter(status="draft").update(status="archived")

# تحديث بالاعتماد على القيمة الحالية نفسها (مع F)
Post.objects.filter(pk=post_id).update(views=F("views") + 1)

💡 نصائح عملية

  • استخدمها دائمًا بدل حلقة for + save() عند تحديث نفس القيمة لعدد كبير من السجلات دفعة واحدة

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

  • توقّع تنفيذ منطق save() المخصّص أو إشارات post_save بعد update() — لا تُطلَق إطلاقًا لأن العملية تُنفَّذ كجملة SQL مباشرة بلا استدعاء save() لكل كائن

خصائص ذات صلة

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