pre_save, save, post_save
をオーバーライドまたは定義して、モデルインスタンスが保存されたときに必要な処理を実行できることがわかりました。
どの状況でどの方法が推奨されますか?その理由は?
例を挙げて説明します。
pre_save
および post_save
は、モデルによって送信される signals です。簡単に言うと、モデルのsave
の前または後に実行するアクションが呼び出されます。
A save
次のステップをトリガーします
Djangoはこれらのシグナルをオーバーライドする方法を提供します。
さて、
pre_save
信号は、データベースへの実際の保存が行われる前に、いくつかの処理でオーバーライドできます-例:(pre_save
が頭のてっぺんで理想的な場所の良い例がわかりません)
notがまだ編集されているModelA
のすべてのオブジェクトへの参照を格納するModelB
があるとします。このため、ModelA
のModelB
メソッドが呼び出される直前にpre_save
シグナルを登録してsave
に通知することができます(post_save
の登録を妨げるものはありません信号もここにあります)。
これで、モデルのsave
メソッド(シグナルではない)が呼び出されます-デフォルトでは、すべてのモデルにsave
メソッドがありますが、オーバーライドできます。
class ModelB(models.Model):
def save(self):
#do some custom processing here: Example: convert Image resolution to a normalized value
super(ModelB, self).save()
次に、post_save
信号を登録できます(これはpre_save
より使用されます)
一般的なユースケースは、UserProfile
オブジェクトがシステムで作成されるときのUser
オブジェクトの作成です。
システム内のすべてのUserProfile
に対応するUser
オブジェクトを作成するpost_save
信号を登録できます。
シグナルは、物事をモジュール化し、明示的に保つ方法です。 (明示的にModelA
に通知しますsave
またはModelB
で何かを変更した場合)
この質問にもっとよく答えるために、より具体的な現実の例を考えます。その間、私はこれがあなたに役立つことを願っています
pre_save
トランザクションが保存される前に使用されます。
post_save
トランザクションの保存後に使用されます。
たとえば、FileField
またはImageField
があり、file
またはimage
が実際に存在するかどうかを確認する場合は、pre_save
を使用できます。
UserProfile
があり、新しいUser
が作成された瞬間に新しいものを作成したい場合は、post_save
を使用できます。
再帰のリスクを忘れないでください。 .updateメソッドの代わりにpost_saveメソッドをinstance.save()呼び出しで使用する場合は、post_saveシグナルを切断する必要があります。
Signal.disconnect(receiver = None、sender = None、dispatch_uid = None)[source]シグナルからレシーバーを切断するには、Signal.disconnect()を呼び出します。引数はSignal.connect()で説明されています。このメソッドは、レシーバーが切断されている場合はTrueを、切断されていない場合はFalseを返します。
Receiver引数は、切断する登録済みのレシーバーを示します。 dispatch_uidを使用して受信者を識別する場合は、Noneになることがあります。
...その後、再度接続します。
pdate()メソッドはpre_およびpost_シグナルを送信しません。