model validation के बारे में:
ध्यान दें कि full_clean() स्वचालित रूप से कहा जा नहीं होगा जब आप अपने मॉडल के सेव() विधि
फिर कहते हैं, pre-save signal
के बारे में, ध्यान दें कि आप उदाहरण मिल यह सहेजा जा रहा है संदेश के साथ पैरामीटर के रूप में भेजा गया है। चूंकि आपके मॉडल का पूर्व संस्करण केवल डेटाबेस में मौजूद है, मुझे नहीं लगता कि आप गुणों के पिछले मूल्य कहां प्राप्त कर सकते हैं ...
आप यह नहीं बताते कि आप ऐसा क्यों करना चाहते हैं, इसलिए यह कठिन है कहने के लिए है, लेकिन अन्य समाधान मैं अभी सोच रहा हूँ:
* defining a custom signal that is sent everytime the attributes you are interested in are modified... This signal would then send two arguments : new value, old value
* perform the check directly when setting the attributes
आप अधिक विवरण देते हैं, तो यह आसान हो सकता है ...
संपादित करें:
यह सही है ... तो आप एक कस्टम 'foo_has_updated' उत्सर्जित करते हैं, आप सुनिश्चित नहीं होंगे कि संशोधन सहेजा गया है।
इस मामले में, मुझे लगता है कि आप चर आपकी रुचि है, जबकि उदाहरण के आरंभ कैश कर सकता है, और बाद को बचाने या पूर्व बचाने के संकेत को पकड़ने।
* With pre-save, you would be able to pre-process the data, but the saving operation might fail
* With post-save, you would be sure that the data has been saved.
अपने चर कैशिंग इस तरह किया जा सकता है:
class CachedModel(models.Model):
cached_vars = [var1, var2, varN]
def __init__(self, *args, **kwargs):
super(CachedModel, self).__init__(*args, **kwargs)
self.var_cache = {}
for var in self.cached_vars:
self.var_cache[var] = copy.copy(getattr(self, var))
या कुछ इस तरह ... फिर, अपने संकेत हैंडलर में:
def post_save_handler(sender, **kwargs):
instance = kwargs["instance"]
[(instance.var_cache[var], getattr(instance, var)) for var in instance.cached_var]
#[(<initial value>, <saved value>)
और तुम मिल गया है कि तुम क्या जरूरत (मुझे लगता है)!!!
आपके उत्तर के लिए धन्यवाद। विशेष रूप से, और फिर भी काफी सामान्य रूप से, मैं जानना चाहता हूं कि एक विशेष क्षेत्र (उदाहरण के लिए एक विकल्प क्षेत्र) बदल दिया गया है। आगे बढ़ते हुए, जैसा कि आपने कहा था, मैं ऐसा करना चाहता हूं - ऐसा होने पर कस्टम सिग्नल छोड़ दें। इस प्रकार मेरे प्रश्न पर वापस जा रहा है - जब कोई मॉडल अपडेट किया जाता है, तो मैं इस सिग्नल को भेजने के लिए अपने पिछले मानों की तुलना कैसे कर सकता हूं? (यदि ऑब्जेक्ट को post_save से पहले सहेजने की गारंटी नहीं है, तो यह सत्यापित किए बिना foo_has_updated सिग्नल को निकालने का अधिकार प्रतीत नहीं होता है ... लेकिन यह एक और सवाल है)। –