有幾次我遇到了情況,在保存時我需要知道哪些模型字段將被更新並採取相應的行動。保持跟蹤上次保存在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 2010-01-09 08:12:48