有几次我遇到了情况,在保存时我需要知道哪些模型字段将被更新并采取相应的行动。保持跟踪上次保存在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