我正在尝试检测ImageField的更改,以便通过编程将更改与Hg同步。包含ImageField的模型是使用Django-multilingual进行本地化的,所以我必须单独检测每个字段的更改,而不是假设每次都更改文件。
我使用pre和post save信号来实现这一点,在pre-save中保存实例,并在post-save中检测字段值的变化。这对于添加、删除或使用不同文件名的图像进行更改时非常有用。然而,当我上传具有相同文件名的图像时,我的代码无法检测到图像实际发生了更改,因此没有文件更改与Hg同步。
我希望能够为旧文件生成校验和(很容易做到,因为我知道它在presave实例中的位置),并将其与新文件的校验和进行比较(不是那么简单,因为尝试从字段值中取出它会将我带到旧文件)。
如果有一种方法可以让我找到新上传的文件(大概在内存中,因为Django不会临时保存2.5MB以下的文件),并将其保存到一个临时目录中,那么我将很容易为它生成一个校验和。然而,我不确定我将从哪里获得该文件。
在post_save信号期间,我可以从哪里获取文件?或者,有没有其他我还没有想过的实现这种变化检测的方法?
谢谢你,瑞奇
发布于 2013-03-01 19:33:40
添加此代码段“
def has_changed(instance, field):
if not instance.pk:
return False
old_value = instance.__class__._default_manager.\
filter(pk=instance.pk).values(field).get()[field]
return not getattr(instance, field) == old_value然后在你的保存中
def save(self, *args, **kwargs):
if has_changed(self, 'field_here'):
super(Sneetch, self).save(*args, **kwargs)https://stackoverflow.com/questions/12461100
复制相似问题