我在使用Django 1.4,我有以下代码:它是我的Quest
模型的覆盖保存方法。
@commit_on_success
def save(self, *args, **kwargs):
from ib.quest.models.quest_status_update import QuestStatusUpdate
created = not self.pk
if not created:
quest = Quest.objects.get(pk=self)
# CHECK FOR SOME OLD VALUE
super(Quest, self).save(*args, **kwargs)
我无法找到一种聪明的方法。对于我正在更新的对象进行新查询以找出旧的实例值,对我来说似乎非常愚蠢。
有更好的方法吗?
谢谢大家。
旧金山
答案 0 :(得分:15)
您可以将旧值存储在init方法中:
def __init__(self, *args, **kwargs):
super(MyModel, self).__init__(*args, **kwargs)
self.old_my_field = self.my_field
def save(self, *args, **kwargs):
print self.old_my_field
print self.my_field
您可以使用深度复制或类似的东西来复制整个对象,以便以后在保存和删除方法中使用。
答案 1 :(得分:9)
Django不会缓存模型实例的旧值,因此您需要自己执行此操作或在保存之前执行其他查询。
一种常见的模式是使用预保存信号(或将此代码直接放在save()方法中,就像你所做的那样):
old_instance = MyModel.objects.get(pk=instance.pk)
# compare instance with old_instance, and maybe decide whether to continue
如果你想保留旧值的缓存,那么你可能会在你的视图代码中这样做:
from copy import deepcopy
object = MyModel.objects.get(pk=some_value)
cache = deepcopy(object)
# Do something with object, and then compare with cache before saving
django开发人员也有a recent discussion关于此问题,以及其他一些可能的解决方案。
答案 2 :(得分:1)
我正在使用django-reversion信号检查旧值的差异,但相同的逻辑将适用于保存信号。我的不同之处在于我想保存该字段是否已保存。
@receiver(reversion.pre_revision_commit)
def it_worked(sender, **kwargs):
currentVersion = kwargs.pop('versions')[0].field_dict
fieldList = currentVersion.keys()
fieldList.remove('id')
commentDict = {}
print fieldList
try:
pastVersion = reversion.get_for_object(kwargs.pop('instances')[0])[0].field_dict
except IndexError:
for field in fieldList:
commentDict[field] = "Created"
comment = commentDict
except TypeError:
for field in fieldList:
commentDict[field] = "Deleted"
comment = commentDict
else:
for field in fieldList:
try:
pastTest = pastVersion[field]
except KeyError:
commentDict[field] = "Created"
else:
if currentVersion[field] != pastTest:
commentDict[field] = "Changed"
else:
commentDict[field] = "Unchanged"
comment = commentDict
revision = kwargs.pop('revision')
revision.comment = comment
revision.save()
kwargs['revision'] = revision
sender.save_revision