3

我正在尝试检测对 ImageField 的更改,以便以编程方式将更改与 Hg 同步。包含 ImageField 的模型正在使用 Django 多语言进行本地化,因此我必须单独检测每个字段的更改,而不是假设文件每次都更改。

我正在使用 pre 和 post save 信号来完成此操作,将实例保存在 pre-save 中并检测 post-save 中字段值的变化。这适用于使用不同文件名的图像添加、删除或更改图像时。但是,当我上传具有相同文件名的图像时,我的代码无法检测到图像实际发生了变化,因此没有文件更改与 Hg 同步。

我希望能够为旧文件生成校验和(很容易完成,因为我知道它在 presave 实例中的位置),并将其与新文件的校验和进行比较(不像试图从字段值将我带到旧文件)。

如果有办法让我找到新上传的文件(大概在内存中,因为 Django 不会将文件临时保存在 2.5MB 以下),并将其保存到临时目录,我很容易为它生成校验和. 但是,我不确定从哪里获取文件。

在 post_save 信号期间我可以从哪里获取文件?还是有另一种我没有想到的完成这种变化检测的方法?

谢谢,丰富

4

1 回答 1

4

添加此片段”

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)
于 2013-03-01T11:33:40.050 回答