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