0

モデルインスタンスの変更を追跡するdjango-simple-historyモジュールを使用しています。ただし、post_save信号を使用しています。私のプロジェクトでは、update()をトリガする必要があります。Djangoトリガpost_save on update()

私の質問は:post_save信号をトリガするupdate()メソッドを上書きする方法ですか?

+0

update()を実行するのではなく、すでにpost_save()を呼び出しているので、save()を使用できますか? – rajkris

答えて

0

この問題は、.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つずつ保存する必要があります。これを残念ながら回避する方法はありません。

関連する問題