3

プログラムで変更をHgと同期するために、ImageFieldへの変更を検出しようとしています。ImageFieldを含むモデルは、Django-multilingualを使用してローカライズされているため、ファイルが毎回変更されると想定するのではなく、各フィールドの変更を個別に検出する必要があります。

これを実現するために保存前と保存後のシグナルを使用しており、インスタンスを保存前に保存し、保存後のフィールド値の変化を検出しています。これは、別のファイル名の画像で画像を追加、削除、または変更する場合に最適です。ただし、同じファイル名の画像をアップロードすると、コードが画像が実際に変更されたことを検出できないため、ファイルの変更がHgと同期されません。

古いファイルのチェックサムを生成し(保存前のインスタンスからファイルがどこにあるかを知っているので簡単に実行できます)、これを新しいファイルのチェックサムと比較できるようにしたいです(からプルしようとするほど簡単ではありません)。フィールド値は古いファイルに移動します)。

新しくアップロードされたファイル(おそらく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 に答える