اذهب إلى المحتوى

السؤال

نشر

أريد تشغيل إجراء خاص في التابع save لكائن نموذج model في جانغو Django عندما أقوم بحفظ سجل جديد (وليس عند تحديث سجل موجود بالفعل)

لذلك كنت أتسأل هل التحقق من (self.id! = None) ضروري وكافي لضمان أن السجل جديد (أي أنها عملية create) ولا يتم تحديثه (وليست عملية update)؟ أهل توجد حالات خاصة قد تؤدي إلى تنفيذ الكود في حالة عمل تحديث update أيضًا؟

Recommended Posts

  • 1
نشر

يمكنك أن تقوم بالتأكد من أن الكائن يتم إنشائه وليس تحديثه في قاعدة البيانات بأكثر من طريقة:

  • الطريقة الأولى هي إستخدام self.pk على النحو التالي:
    self.pk is None:

    الشرط السابق يتم تنفيذه فقط في حالة كان الكائن يتم إنشائه في قاعدة البيانات لأول مرة، أي أنها عملية insert وليست Update.
    ملاحظة يجب أن يتم إضافة السطر السابق قبل إستدعاء التابع save من الصنف الأب super، أي قبل super(...).save

  • يوفر جانغو Django خاصية فريدة لمعرفة نوع العملية، هل هي عملية حفظ كائن جديد Create أو عملية تحديث كائن موجود مسبقًا، وذلك من خلال الخاصية _state.adding:
    self._state.adding is True

    إن تحقق الشرط فهي عملية insert وإن لم يتحقق فهي عملية تحديث Update

  • 0
نشر (معدل)

بالاضافة لطريقة سامح، يمكننا كذلك تفحص حالة  self._state حيث انه اذا كانت:

self._state.adding is True

فهذا يعني انه تم انشاؤه created

اما اذا كانت الحالة:

self._state.adding is False

فهذا يعني انه تم تحديثه updated

وبطريقه اخرى يمكنك اضافة تاريخ انشاؤه كالتالي:

date_created = models.DateTimeField(auto_now_add=True)

والتأكد من وجود التاريخ من عدمه حيث انه اذا لم يوجد تاريخ للانشاء فهذا يعني انه تم تحديثه updated:

created = self.date_created is None

 

تم التعديل في بواسطة Ahmed Sharshar
  • 0
نشر

لا يكفي التحقق من self.pk == None لتحديد ما إذا كان سيتم إدراج الكائن أو تحديثه في قاعدة البيانات.
الكائن الذي تم إنشاؤه حديثاً (self) يحتوي على قيمة pk يمكنك أن تتحقق من وجود self.id وال flag (العلم) force_insert. كما يلي:

if not self.pk or kwargs.get('force_insert', False):
    self.created = True
#save استدعاء دالة 
super(self.__class__, self).save(*args, **kwargs)
#التالي if ضمن بلوك  post save قم بتنفيذ كل إجراءات ال
if getattr(self, 'created', False):
    # Statements 

 

  • 0
نشر

للحصول على حل يعمل أيضا حتى عندما يكون لديك UUIDField كمفتاح أساسي يمكنك توصيل إشارة post_save من Django. أضف الكود التالي إلى models.py:

from django.db.models.signals import post_save
from django.dispatch import receiver

@receiver(post_save, sender=MyModel)
def mymodel_saved(sender, instance, created, **kwargs):
    if created:
        # قم بعمل إضافي في المثال الخاص بك ، على سبيل المثال
        # instance.generate_avatar()=> عمل 
        # instance.send_email_notification()=> إرسال إشعار البريد الإلكتروني
        pass

سيؤدي رد الاتصال هذا إلى حظر طريقة الحفظ ، بحيث يمكنك القيام بأشياء مثل تشغيل الإشعارات أو تحديث النموذج بشكل أكبر قبل إرسال الرد، سواء كنت تستخدم النماذج أو إطار عمل Django REST لطلبات AJAX.

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...