モデルインスタンスの変更を追跡するdjango-simple-historyモジュールを使用しています。ただし、post_save信号を使用しています。私のプロジェクトでは、update()をトリガする必要があります。Djangoトリガpost_save on update()
私の質問は:post_save信号をトリガするupdate()メソッドを上書きする方法ですか?
モデルインスタンスの変更を追跡するdjango-simple-historyモジュールを使用しています。ただし、post_save信号を使用しています。私のプロジェクトでは、update()をトリガする必要があります。Djangoトリガpost_save on update()
私の質問は:post_save信号をトリガするupdate()メソッドを上書きする方法ですか?
この問題は、.update()
がそのことを行うためにデータベースからオブジェクトを読み込む必要がないという問題があります。 、単に個々の行を保存し、Falseにis_active
を設定するには、データベースから潜在的に行の数十万人をロードされていませんDjangoはここで何をするか
users = User.objects.filter(date_joined__lte=now() - timedelta(days=30)
users.update(is_active=False)
:1万行をユーザーテーブルの上にこの例を考えてみましょう代わりにUPDATE
コマンドをデータベースエンジン経由で直接発行してください:UPDATE users SET is_active=False WHERE date_joined < 30_DAYS_AGO
。これはDjangoが更新時にpost_save
をトリガーしない唯一の理由です。データベースから最初に何もロードしていないためです。
信号をトリガーするには、データベースからすべてのオブジェクトをロードし、データベースの問合せUPDATE users SET is_active=False WHERE id=X
を各行ごとに1回ずつ発行し、信号を送信する必要があります。パフォーマンスを低下させるだろう。
信号を実際に使用する場合は、データベースからオブジェクトをロードし、繰り返し処理して一度に1つずつ保存する必要があります。これを残念ながら回避する方法はありません。
update()を実行するのではなく、すでにpost_save()を呼び出しているので、save()を使用できますか? – rajkris