pre_save, save, post_saveモデル インスタンスが保存されたときに、必要なことを行うように オーバーライドまたは定義できることがわかりました。
どの状況でどちらが優先され、その理由は何ですか?
pre_save, save, post_saveモデル インスタンスが保存されたときに、必要なことを行うように オーバーライドまたは定義できることがわかりました。
どの状況でどちらが優先され、その理由は何ですか?
例を挙げて説明するために最善を尽くします。
pre_saveおよびモデルによって送信されるpost_saveシグナルです。save簡単に言えば、モデルが呼び出される前または後に実行するアクションです。
Asave は次のステップをトリガーします
Django は、これらのシグナルをオーバーライドする方法を提供しています。
今、
pre_saveデータベースへの実際の保存が行われる前に、何らかの処理のためにシグナルをオーバーライドすることができます - 例:(pre_save私の頭の中で理想的な場所の良い例がわかりません)
まだ編集されていないModelAすべてのオブジェクトへの参照が格納されているとします。このために、のメソッドが呼び出される直前に通知するシグナルを登録できます (ここでもシグナルの登録を止めるものは何もありません)。ModelBpre_saveModelAModelBsavepost_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のオブジェクトの作成です。
システム内のすべてに対応するオブジェクトpost_saveを作成するシグナルを登録できます。UserProfileUser
シグナルは、物事をモジュール化して明示的に保つ方法です。ModelA( isaveまたは何かを変更した場合は明示的に通知しますModelB)
この質問によりよく答えるために、より具体的な実例を考えてみます。それまでの間、これがお役に立てば幸いです
pre_save
トランザクションが保存される前に使用されます。
post_save
トランザクションが保存された後に使用されます。
pre_saveたとえば、 または がある場合に使用してFileField、またはが実際に存在するかImageField どうかを確認できます。fileimage
を持っていて、新しいものが作成された瞬間に新しいものを作成したいpost_save場合に使用できます。UserProfileUser