سؤال

أواجه مشكلة في فهم هذا.الآن لدي بعض النماذج التي تبدو مثل هذا:

 def Review(models.Model)
    ...fields...
    overall_score = models.FloatField(blank=True)

def Score(models.Model)
    review = models.ForeignKey(Review)
    question = models.TextField()
    grade = models.IntegerField()

الاستعراض لديها العديد من "عشرات" ، overall_score هو متوسط الدرجات.عند مراجعة أو درجة حفظ أحتاج إلى حساب overall_score المتوسط.الآن أنا باستخدام تجاوزها حفظ الأسلوب.لن يكون هناك أي فوائد استخدام جانغو إشارة المرسل?

هل كانت مفيدة؟

المحلول

تعد إشارات الحفظ/الحذف مفضلة بشكل عام في المواقف التي تحتاج فيها إلى إجراء تغييرات ليست خاصة تمامًا بالنموذج المعني، أو يمكن تطبيقها على النماذج التي لديها شيء مشترك، أو يمكن تهيئتها للاستخدام عبر النماذج.

تم تجاوز مهمة واحدة مشتركة save الأساليب هي الإنشاء الآلي للارتداءات الثابتة من بعض حقول النص في النموذج.هذا مثال على شيء، إذا كنت بحاجة إلى تنفيذه لعدد من النماذج، فسوف تستفيد من استخدام pre_save إشارة، حيث يمكن لمعالج الإشارة أن يأخذ اسم حقل البزاقة واسم الحقل الذي يولد البزاقة منه.بمجرد أن يكون لديك شيء من هذا القبيل في مكانه، فإن أي وظيفة محسنة تقوم بتطبيقها ستنطبق أيضًا على جميع الطرز - على سبيل المثال.ابحث عن البزاقة التي أنت على وشك إضافتها لنوع النموذج المعني، لضمان التفرد.

غالبًا ما تستفيد التطبيقات القابلة لإعادة الاستخدام من استخدام الإشارات - إذا كان من الممكن تطبيق الوظيفة التي توفرها على أي نموذج، فإنها عمومًا (ما لم يكن ذلك لا مفر منه) لن ترغب في أن يضطر المستخدمون إلى تعديل نماذجهم مباشرة للاستفادة منها.

مع django-mptt, على سبيل المثال، استخدمت pre_save إشارة لإدارة مجموعة من الحقول التي تصف البنية الشجرية للنموذج الذي على وشك الإنشاء أو التحديث pre_delete إشارة لإزالة تفاصيل بنية الشجرة للكائن الذي يتم حذفه والشجرة الفرعية الكاملة للكائنات قبله ويتم حذفها.ونظرًا لاستخدام الإشارات، لا يتعين على المستخدمين الإضافة أو التعديل save أو delete الأساليب الموجودة على نماذجهم لإجراء هذه الإدارة لهم، عليهم فقط السماح لـ Django-mptt بمعرفة النماذج التي يريدون إدارتها.

نصائح أخرى

لقد طلبت:

لن يكون هناك أي فوائد استخدام جانغو إشارة المرسل?

لقد وجدت هذا في جانغو مستندات:

تجاوز نموذج أساليب لا تسمى على العمليات المجمعة

لاحظ أن حذف() طريقة كائن ليس بالضرورة يسمى عند حذف الكائنات بكميات كبيرة باستخدام QuerySet أو نتيجة المتتالية حذف.لضمان تخصيص حذف المنطق يعدم ، يمكن استخدام pre_delete و/أو post_delete الإشارات.

للأسف, ليس هناك مشكلة عند إنشاء أو تحديث الكائنات بكميات كبيرة, لأن أيا من إنقاذ () ، pre_save ، post_save هي ودعا.

من: تجاوز مسبقا نموذج الطرق

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

إنه نوع من عدم التطبيع.أنظر إلى هذا حل جميل.تعريف مجال التكوين في المكان.

إضافة صغيرة من جانغو مستندات عن السائبة حذف (.delete() طريقة QuerySet الكائنات):

نضع في اعتبارنا أن هذا سيكون ، كلما كان ذلك ممكنا ، يتم تنفيذها في بحتة SQL و حتى حذف() أساليب الفرد كائن الحالات ليس بالضرورة أن يسمى خلال العملية.إذا كنت قد قدمت مخصص حذف (طريقة) على نموذج فئة ترغب في التأكد من أنه هو دعا, سوف تحتاج إلى "يدويا" حذف مثيلات هذا النموذج (على سبيل المثال ، بالتكرار على QuerySet والدعوة حذف() على كل كائن فردي) بدلا من استخدام السائبة حذف() طريقة QuerySet.

https://docs.djangoproject.com/en/1.11/topics/db/queries/#deleting-objects

و بالجملة التحديث (.update() طريقة QuerySet الكائنات):

وأخيرا أدرك أن التحديث() لا تحديث في SQL المستوى ، وهكذا لا يدعو أي حفظ() الأساليب على النماذج الخاصة بك ، ولا تنبعث منها pre_save أو post_save إشارات (التي هي نتيجة الاتصال النموذج.حفظ()).إذا كنت ترغب في تحديث مجموعة السجلات لفترة نموذج مخصص حفظ (طريقة) ، حلقة فوقها استدعاء حفظ()

https://docs.djangoproject.com/en/2.1/ref/models/querysets/#update

تكون الإشارات مفيدة عندما يتعين عليك تنفيذ بعض العمليات طويلة المدى ولا ترغب في حظر المستخدم الخاص بك في انتظار اكتمال الحفظ.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top