هو التطبيق جانغو الذي يوفر-مؤقتا-المجال جانغو الكرفس مؤجل، وحقول المخزنة مؤقتا على جانغو ORM للمكلف إلى حساب البيانات
باستخدام جانغو مكتب إدارة السجلات والكرفس، والحفاظ-مكلفة لحساب سمات يصل إلى التاريخ.
مثال
نقول لديك طريقة بطيئة على واحد من النماذج الخاصة بك:
الطبقة عمود المصباح (models.Model):
على & nbsp؛property
على & nbsp؛ مواطنه slow_full_name (النفس):
على & nbsp؛ النوم (30)
على & nbsp؛ العودة "ليالي٪٪ s من٪ ق '٪ (self.weight، self.first_name، self.country)
هتاف اشمئزاز. بطئ جدا. دعونا مخبأ ذلك. سنقوم نريد عدد قليل من الأدوات. الكرفس
من CachedIntegerField استيراد django_cached_field، ModelWithCachedFields
الطبقة عمود المصباح (models.Model، ModelWithCachedFields):
على & nbsp؛ slow_full_name = CachedTextField (خالية = صحيح)
على & nbsp؛ مواطنه calculate_slow_full_name (النفس):
على & nbsp؛ النوم (30)
على & nbsp؛ العودة "ليالي٪٪ s من٪ ق '٪ (self.weight، self.first_name، self.country)
(نعم، هو مجرد اتفاقية. I بوضوح لم تعط calculate_ يصل شبح القضبان ...)
وبعد ذلك، الهجرة مخطط ديسيبل لتشمل مجال التخزين المؤقت الجديد باستخدام الجنوب، أو لفة بنفسك. لاحظ أن حقلين ستضاف إلى هذا الجدول، cached_slow_full_name من نوع النص وslow_full_name_recalculation_needed من نوع منطقية، وربما المتعثرين إلى true.
بالفعل هذا هو كيندا أفضل. lamppost.slow_full_name قد يستغرق 30 ثانية أول مرة يحصل يطلق عليه لسجل معين، ولكن منذ ذلك الحين، وأنها سوف تكون لحظة اقترب منه. وبطبيعة الحال، في هذه المرحلة، وسوف لا تتغير أبدا بعد أن المكالمة الأولى.
قطعة المهم المتبقية من هذا اللغز هو لإبطال مخبأ لدينا. وربما تتغير الحقول المكونة ثوسيس في بعض views.py (هذا يمكن أن يكون أكثر ذكاء عن ملاحظة إذا تم تحديث القيم ذات الصلة):
render_to ("عمود إنارة / edit.html")
صفر تحرير (طلب، lamppost_id):
على & nbsp؛ عمود إنارة = Lamppost.objects.get (PK = lamppost_id)
& nbsp؛ إذا request.METHOD == 'ما بعد':
على & nbsp؛ شكل = LamppostForm (request.POST)
& nbsp؛ إذا form.is_valid ():
على & nbsp؛ form.save ()
على & nbsp؛ form.instance.flag_slow_full_name_as_stale ()
على & nbsp؛ آخر:
على & nbsp؛ شكل = LamppostForm ()
على & nbsp؛ عودة {'شكل': النموذج، "عمود إنارة ': عمود إنارة}
هذا هو الجزء الأصعب كما المطور! يتطلب التخزين المؤقت لك مطاردة كل مكان يمكن تغيير قيمة واصفا هذه الطريقة flag_slow_full_name_as_stale. وبلد تعيين قيمة جديدة العشوائية كل صباح في cron'o'clock؟ وكان هذا العلم أن يكون أفضل قديمة كتبها cron'o'one. هل حساب الوزن على أساس مجموع كل الحمام المرتبطة؟ ربط إلى الهبوط الحمام. وإقلاعها. وكل ما يغير مثقال حمامة الفرد. كما قال أبراهام لينكولن، "لا يوجد سوى اثنين المشاكل الصعبة في البرمجة: التسمية، مخبأ إبطال وإيقاف من جانب واحد الأخطاء."
تركيب
يمكنك جعل الامور سهلة على نفسك:
PIP تثبيت مؤقتا جانغو الميدان
أو، للتثبيت اليدوي، يمكنك استنساخ الريبو وتثبيته باستخدام الثعبان وsetup.py:
بوابة استنساخ بوابة: //github.com/aquameta/django-cached-field.git
مؤتمر نزع السلاح جانغو، مؤقتا الميدان /
بيثون setup.py تثبيت
اختبار مع جانغو 1.3.1، 2.3.1 الكرفس، الكرفس جانغو-2.3.3.
ترتيب
هما إعدادات التغييرات المطلوبة الى حد كبير عن أشياء للعمل: تأكد من انها التطبيق المسجلين، وجعل متأكد من يرى الكرفس ملف مهامها:
INSTALLED_APPS + = ['django_cached_field'،]
CELERY_IMPORTS + = ['django_cached_field.tasks'،]
تغيير واحد هو اختياري: ما إذا كانت إعادة الحساب يجب أن يحدث عندما ترفع علم النحو قديمة (الافتراضي) أو أن تترك للفي المرة القادمة يتم الوصول إلى السمة. وهذا مفيد لبيئات الاختبار حيث كنت لا تهتم أن القيم المخزنة مؤقتا الخاص بك غير صالحة. لاحظ أنه في هذه الحالة، لن تحتاج الكرفس.
CACHED_FIELD_EAGER_RECALCULATION = صحيح أو خطأ # لبيئات الاختبار
هذا هو خيار العالمي، لذلك ينبغي بدلا من ذلك أن تعالج الاستثناءات الفردية عن طريق تمرير الحجة and_recalculate لدعوة flag_FIELD_as_stale.
المحاذير
- حالة سباق إذا قمت بوضع علامة الميدان وقديمة في معاملة ديسيبل أن يستغرق وقتا أطول لإتمام من يأخذ هذه المهمة الكرفس ليتم استدعاؤها.
- جميع أساليب ORM (على سبيل المثال order_by، فلتر) تحتاج إلى استخدام cached_FIELD.
- recalculate_FIELD يستخدم .update (cached_FIELD = لتعيين القيمة.
- flag_FIELD_as_stale يستخدم .update، فضلا
المتطلبات:
بيثون.
جانغو
لم يتم العثور على التعليقات