2009-07-17 20 views
11

मुझे वास्तव में स्क्लेक्लेमी की सुविधा पसंद है जो आपको यह देखने की अनुमति देता है कि कोई ऑब्जेक्ट गंदा है या नहीं: यदि इसे डेटाबेस से पुनर्प्राप्त किया गया था, या पिछली बार सहेजा गया था, तो इसे संशोधित किया गया है।क्या आप यह पता लगा सकते हैं कि एक Django मॉडल उदाहरण "गंदा" है या नहीं?

क्या यह जानकारी Django ORM से प्राप्त करना संभव है?

नोट यह Dirty fields in django जैसा नहीं है, क्योंकि मुझे इस बात की परवाह नहीं है कि पिछले डेटा क्या था, हालांकि एसएलॉट का जवाब ऐसा करने का एक तरीका प्रदान कर सकता है, लेकिन मुझे ऐसा कोई तरीका चाहिए जो हिट नहीं करता डेटाबेस।

मैंने django.db.transaction.is_dirty() पर भी देखा है, लेकिन यह समाधान नहीं लगता है।

+0

सवाल बहुत अलग नहीं है और http://stackoverflow.com/questions/110803/dirty-fields-in-django को एक ही जवाब आपकी समस्या – dnozay

+0

यह है के लिए काम कर सकते हैं http://stackoverflow.com/a/332225/1733117 – dnozay

उत्तर

4

एक समाधान एक डेटाबेस क्वेरी क्या करता है कि:

class DirtyMixin(object): 
    @property 
    def is_dirty(self): 
     db_obj = self.__class__.objects.get(self.pk) 
     for f in self._meta.local_fields: 
      if self.__getattribute__(f.name) != db_obj.__getattribute__(f.name): 
       return True 
     return False 

फिर आप एक मॉडल के लिए एक पूर्वज वर्ग के रूप में इस जोड़ सकते हैं। या, बंदर-रूपों को पैच करें। मॉडल श्रेणी, यदि आप चाहें तो।

from django.db import models 
models.Model.__bases__ = (DirtyMixin,) + models.Model.__bases__ 
+0

के समान उत्तर का उत्तर अगर मॉडल अभी तक सहेजा नहीं गया है तो क्या यह अपवाद नहीं फेंक देगा? ऐसा लगता है कि पकड़ा जाना चाहिए और 'ट्रू' वापस आ गया। –

+0

हाँ, यह शायद एक निरीक्षण है। –

+0

विशेषताएँ त्रुटि: 'MyObject' ऑब्जेक्ट में 'get' कोई विशेषता नहीं है। क्या आपका मतलब स्वयं की तरह नहीं है .__ वर्ग __। Objects.get (pk = self.pk)? – Julian

2

एक और तरीका है, __setattr__ अधिभावी से जुड़े, this Django ticket में कुछ विस्तार से चर्चा की है।

+0

यह एक अच्छा जवाब है लेकिन बेहतर होगा अगर इसमें कोड न केवल एक लिंक शामिल है। – poolie

1

कोशिश उपयोग lck.django वर्ग TimeTrackable

+0

अच्छा। ऐसा करने के लिए एक शक्तिशाली तरीका लगता है। –

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

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