2011-03-09 36 views
20

में सहेजने से पहले मॉडल बदल गया है या नहीं, मेरे पास एक डेटाबेस मॉडल है जिसे दूरस्थ डेटा (HTML स्क्रैपर के माध्यम से) में परिवर्तनों के आधार पर अपडेट किया जा रहा है।पता लगाएं कि Django

मैं एक क्षेत्र बनाए रखना चाहते हैं changed कहा जाता है - एक टाइमस्टैम्प दर्शाने जब पिछली बार है कि मॉडल के मूल्यों क्या वे पहले से थे से बदल (ध्यान दें कि यह auto_now से अलग है के रूप में इन क्षेत्रों हर बार एक मॉडल के save विधि कहा जाता है अपडेट किया जाता है)। ,

एक मॉडल के save विधि में वहाँ पता लगाने के लिए अगर एक मॉडल उदाहरण के वर्तमान मूल्यों डेटाबेस में मूल्यों से अलग हैं एक सीधा तरीका है:

यहाँ मेरे सवाल है? या, changed टाइमस्टैम्प को आसानी से बनाए रखने के लिए कोई वैकल्पिक तरीका हैं?

+0

किसी को 'Django-extensions' के साथ अनुभव हुआ है? उनके पास 'टाइमस्टैम्पड मॉडल' श्रेणी है जो मैं कर रहा हूं जो कर सकता हूं लेकिन दस्तावेज़ीकरण बहुत उपयोगी नहीं है (http://packages.python.org/django-extensions/model_extensions.html) – advait

उत्तर

1

मेरे लिए ध्वनि क्या आप चाहते हैं जैसे संकेतों है: http://docs.djangoproject.com/en/1.2/topics/signals/

आप एक और मॉडल में संबंधित क्षेत्र अद्यतन करने के लिए एक post_save सिग्नल का उपयोग पिछले मान स्टोर करने के लिए कर सकता है। फिर अगले दौर में आप की तुलना करने के लिए कुछ होगा।

3

आप उन्हें सहेजते समय रिकॉर्ड मानों के चेकसम की गणना करने का प्रयास कर सकते हैं। फिर जब आप इसे बाद में पढ़ लें, चेकसम को दोबारा जांचें और देखें कि यह बदल गया है या नहीं। शायद crc32 पायथन zlib मानक मॉड्यूल में कार्य करता है। (मुझे यकीन है कि प्रदर्शन किस तरह यह होता नहीं हूँ। तो आपको लगता है कि जांच करने के लिए कर सकते हैं।) एक Django मॉडल उदाहरण पर

+0

दिलचस्प है। क्या ऑब्जेक्ट के डेटा की पूरी तरह से देखने का कोई आसान तरीका है ताकि इसे आसानी से चेक किया जा सके? और क्या यह संभव है कि किसी ऑब्जेक्ट के दो समान (समान फ़ील्ड मान वाले) के अलग-अलग "डेटा" (हमारे चेकसम फ़ंक्शन द्वारा इनपुट इनपुट) हो। – advait

+0

1. जिस विधि का मैं उपयोग करूंगा वह केवल सभी फ़ील्ड डेटा प्राप्त करना है, प्रत्येक को एक स्ट्रिंग में कनवर्ट करना है, इसे सब कुछ जोड़ना है, और चेकसम करना है। 2. यह सैद्धांतिक रूप से संभव है कि दो अलग-अलग डेटा एक ही चेकसम के साथ आते हैं, लेकिन यह बहुत ही असंभव है। यदि आप इसके बारे में वास्तव में चिंतित हैं, तो आप एक क्रिप्टोग्राफिक हैश फ़ंक्शन का उपयोग कर सकते हैं जिसमें यह सब असंभव हो; लेकिन यह गणना करने के लिए और अधिक महंगा होगा। – dappawit

+0

@ डैपॉइट आपको कॉन्सटेनेशन का ऑर्डर करने पर भी विचार करना चाहिए जो आपके तर्क के साथ समस्याएं पैदा कर सकता है। हैश ("ए = 1 बी = 2 सी = 3")! = हैश ("ए = 1 सी = 3 बी = 2")। भले ही, एक और अच्छा दृष्टिकोण। – Chris

34

यदि आप एक फॉर्म के माध्यम से अपना उदाहरण सहेजते हैं, तो आप form.has_changed() देख सकते हैं।

+13

और यदि आप जानना चाहते हैं कि कौन सा फ़ील्ड बदल गया है: 'form.changed_data' –

+0

धन्यवाद, इन दोनों की आवश्यकता है :) – Lee

संबंधित मुद्दे