@kyanny's blog

我々の目的は何かと聞かれて、私はたった一つの言葉で答えることができる。勝利。それだけだ - ウィンストン・チャーチル

Django: Signals を使ってモデルの変更履歴を残す

Signals | Django ドキュメント | Django

ハマったところ

  • pre_save ハンドラの引数に渡される instance の attribute は「更新されるべき値」に置き換わっているので、「更新前の値」を得るには Book.objects.get(id=instance.id) などとして自前で DB から取得する必要がある。
  • get() を使うと book テーブルに一行も無い場合にエラーになる(ので、永遠に一行目を保存できない)。これを防ぐには Book.objects.filter(id=instance.id).first() として例外の発生を抑止する。

gist.github.com