33

pre_save, save, post_saveモデル インスタンスが保存されたときに、必要なことを行うように オーバーライドまたは定義できることがわかりました。

どの状況でどちらが優先され、その理由は何ですか?

4

3 に答える 3

36

例を挙げて説明するために最善を尽くします。

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)

この質問によりよく答えるために、より具体的な実例を考えてみます。それまでの間、これがお役に立てば幸いです

于 2013-07-15T15:38:33.280 に答える
3
pre_save

トランザクションが保存される前に使用されます。

post_save

トランザクションが保存された後に使用されます。

pre_saveたとえば、 または がある場合に使用してFileField、またはが実際に存在するかImageField どうかを確認できます。fileimage

を持っていて、新しいものが作成された瞬間に新しいものを作成したいpost_save場合に使用できます。UserProfileUser

于 2013-07-15T02:19:14.227 に答える