【问题标题】:Django detecting changed ImageField with same filenameDjango 检测具有相同文件名的已更改 ImageField
【发布时间】:2026-02-11 12:55:02
【问题描述】:

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

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

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

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

在 post_save 信号期间我可以从哪里获取文件?或者有没有其他我没有想到的方法来完成这种变化检测?

谢谢, 丰富

【问题讨论】:

    标签: django


    【解决方案1】:

    添加这个 sn-p"

    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)
    

    【讨论】: