कुछ बार मैंने एक स्थिति में भाग लिया है, जब समय बचाने पर मुझे पता होना चाहिए कि कौन से मॉडल फ़ील्ड अपडेट किए जा रहे हैं और तदनुसार कार्य करें।django मॉडल में अंतिम सहेजने के बाद परिवर्तनों का ट्रैक रखना
यह करने के लिए सबसे स्पष्ट समाधान प्राथमिक कुंजी क्षेत्र लेने के लिए और डेटाबेस से मॉडल की प्रतिलिपि प्राप्त करने के लिए है:
class MyModel(models.Model):
def save(self, force_insert=False, force_update=False, using=None):
if self.id is not None:
unsaved_copy = MyModel.objects.get(id=self.id)
# Do your comparisons here
super(MyModel, self).save(force_insert, force_update, using)
कि पूरी तरह से ठीक काम करता है, हालांकि, इसके बारे में हर उदाहरण के लिए डेटाबेस हिट जिस मॉडल को आप सहेज रहे हैं (यदि आप ऐसी कई बचत कर रहे हैं तो काफी असुविधाजनक हो सकता है)।
यह स्पष्ट है कि यदि कोई मॉडल उदाहरण के जीवनकाल (__init__
) की शुरुआत में पुराने फ़ील्ड मानों को "याद" कर सकता है, तो डेटाबेस से मॉडल की एक प्रति पुनर्प्राप्त करने की आवश्यकता नहीं होनी चाहिए। इसलिए मैं इस छोटे से हैक के साथ आया था:
class MyModel(models.Model):
def __init__(self, *args, **kwargs):
super(MyModel, self).__init__(*args, **kwargs)
self.unsaved = {}
for field in self._meta.fields:
self.unsaved[field.name] = getattr(self, field.name, None)
def save(self, force_insert=False, force_update=False, using=None):
for name, value in self.unsaved.iteritems():
print "Field:%s Old:%s New:%s" % (name, value, getattr(self, name, None))
# old values can be accessed through the self.unsaved member
super(MyModel, self).save(force_insert, force_update, using)
यह काम करने लगता है, लेकिन यह django.db.models.Model
की गैर सरकारी इंटरफ़ेस का उपयोग करता है।
शायद कोई ऐसा करने के लिए एक क्लीनर तरीका जानता है?
नहीं, मैं इसे व्यवस्थापक टेम्पलेट के संदर्भ में नहीं पूछ रहा था, हालांकि मैं जांचता हूं कि यह कैसे किया गया है, टिप के लिए धन्यवाद। – shylent